8.1 异常概述
在程序中,错误可能产生于程序员没有预料到的各种情况,或者超出了程序员可控范围的环境因素,如试图打开一根本不存在的java文件,在java中,这种在程序运行时可能出现的一些错误称为异常。java语言的异常处理机制优势之一就是可以将异常情况在方法中调用进行传递,通过传递可以将异常情况传到合适的位置在进行处理。
public class Baulk {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
int result = 3/0;//定义int型变量并赋值
System.out.println(result);//输出变量
}
}
异常结果
8.2 异常分类
java类库的每个包中都定义了异常类,所有这些类都是Throwable类的子类。Throwable类派生了两个子类,分别是Error类和Exception类。Error类错误比较严重不可更改。Exception类称为非致命性类,可以通过捕捉处理使程序继续执行。Exception类又可以根据错误发生的原因分为运行时异常和非运行时异常。
8.21 系统错误——Error
Error类及其子类通常用来描述java运行系统中的内部错误。
public class Baulk {//创建类
public static void main(String[] args) {//主方法
System.out.println("梦想照亮现实!!!")
}
}
异常结果
8.22 异常——Exception
Excpetion是程序本身可以处理的异常,这种异常主要分为运行时异常和非运行时异常。
1.运行时异常
代码
public class Thundering {//创建类
public static void main(String[] args) {//主方法
// TODO Auto-generated method stub
String str = "lili";//定义字符串
System.out.println(str +"年龄是:");//输出的提示信息
int age = Integer.parseInt("20");//数据类型的转换
System.out.println(age);//输出信息
}
异常结果
2.非运行时异常
非运行时异常时RuntimeException类及其子类异常以外的异常。
代码
public class Ss {//创建类
private int aa;//定义变量
private String bb;//定义变量
public Ss () {//构造方法
try {
Class.forName("com.mrsoft.Coach");//寻找“教练类”
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Ss team = new Ss();//创建对象
team.bb = "com.mrsoft";//初始化bb
team.aa = 19;//初始化aa
System.out.println("n球队名"+team.bb+"n"+"球员数量:"+team.aa+"名");//输出类型
}
}
异常结果
8.3 捕捉处理异常
非运行时异常分为两种解决方案,一种是使用throws关键字,一种是使用try...catch代码块。
try...catch代码块主要用来对异常进行捕捉并处理。语法如下:
try{
//程序代码块
}
catch{
//对Exception的处理
}
finally{
//代码块
}
8.3.1 try...catch代码块
代码
public class Take {//创建类
public static void main(String[] args) {
// TODO Auto-generated method stub
try { //try语句中包含可能出现异常的代码
String str = "lili";//定义字符串变量
System.out.println(str+"年龄");//输出类型
int age = Integer.parseInt("20L");//数据转换
System.out.println(age);
}catch (Exception e) { //catch代码块用来获取异常信息
e.printStackTrace();//输出异常性质
}
System.out.println("program over");//输出信息
}
}
异常结果
代码
public class Take2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
try { //try语句中包含可能出现异常的代码
String str = "lili";//定义字符串变量
System.out.println(str+"年龄");//输出类型
int age = Integer.parseInt("20L");//数据转换
System.out.println(age);
}catch (Exception e) { //catch代码块用来获取异常信息
e.printStackTrace();//输出异常性质
}finally {
System.out.println("program over");//输出信息
}
}
}
异常结果
8.4 在方法中抛出异常
如果某个方法可能发生异常,但不想在当前方法中处理这个异常,则可以使用throws、throw关键字在方法中抛出异常。
8.41 使用throws关键字抛出异常
throws关键字通常被应用在声明方法时,用来指定方法可能抛出的异常,多个异常可以使用逗号分隔符。使用throws关键字抛出异常语法格式为:
返回值类型名 方法名(参数表)throws 异常类型名{ 方法体 }
代码
public class Baulk {//创建类
static void pop() throws NegativeArraySizeException{
int [] arr = new int[-3];
}
public static void main(String[] args) {//主方法
try {
pop();
}catch(NegativeArraySizeException e){
System.out.println("pop()方法抛出的异常");
}
}
}
结果
8.4.2 使用throw关键字抛出异常
throw关键字通常用于在方法体中“制造”一个异常,程序在执行到throw语句时立刻终止,它后面的语句不会执行。语法格式如下:
throw new 异常类型名(异常信息)
代码
public class ThowTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num1 = 25;
int num2 = 0;
int result;
if(num2 == 0) {
throw new ArithmeticException("这都不会,小学生都知道:除数不能为0!!!");
}
result = num1 / num2;
System.out.println("两个数的商为:"+result);
}
}
异常结果
8.5 自定义异常
在Java中有些代码运行时没有任何问题,但却不符合我们生活的道理,所以我们面对这种代码是我们就要去自定异常处理。
构建自定义类
public class MyException extends Exception{
public MyException(String ErrorMessage){
super(ErrorMessage);
}
}
代码
public class Baulk {//创建类
static void avg(int age) throws MyException{
if(age<0) {
throw new MyException("年龄不能为负数");
}else {
System.out.println("王师傅今年"+age+"岁了!");
}
}
public static void main(String[] args) {//主方法
try {
avg(-50);
}catch(MyException e){
e.printStackTrace();
}
}
}
结果
8.6 异常的使用原则
(1)不要过度使用异常
(2)不要使用过于庞大的try...catch代码块
(3)避免使用catch(Exception e)
(4)不要忽略捕捉到的异常,遇到异常一定要及时处理
(5)如果父类抛出多个异常,测覆盖方法必须抛出相同的异常或其异常的子类,不能抛出新的异常



