通过本章的学习可以达到一下目标:
item 了解异常的产生原理
掌握异常处理语句的基本格式
掌握throw和throws关键字的作用
可以自定义异常
了解Exception与RuntimeException的区别
了解断言的作用
认识异常:
关于被除数不能为0的说明:
被除数为0在数学上的解法是无穷大,对于计算机来说,如果是无穷大,则意味着内存将全部被占满。
在java中异常处理的语句:
try{
//有可能出现异常的语句
int temp = i / j;//此处会产生异常
System.out.println("两个数字相除结果: " + temp);
}catch (ArithmeticException e) { //异常类 异常对象
// TODO: 编写异常的处理语句
System.out.println("出现异常来:" + e);
}catch (Exception e) {
// TODO: 编写异常的处理语句
}finally {
//一定会运行的程序代码
}
从程序的运行结果可以清楚地发现,因为程序中加入了异常处理代码,所以当有异常发生后,整个程序也不会因为异常的产生而中断执行。
异常类的继承结构
在整个java的异常结构中,实际上有两个类最常用的类,分别是Exception和Error,这两个类都是Throwable的子类,
如下图:
Exception:一般表示的是程序中出现的问题,可以直接使用try...catch处理。 Error:一般指的是JVM错误,程序中无法处理。 一般情况下,开发者习惯于将Exception和Error统称为异常,而算术异常、数字格式异常等都属于Exception的子类。
java的异常处理机制
在整个java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下: 1.一旦产生异常,则首先会产生一个异常类的实例化对象。 2.在try语句中对此异常对象进行捕捉。 3.产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功,则执行catch语句中的代码。
一般在开发时,不管出现任何异常时,都可以直接使用Exception进行处理,这样会比较方便。
那么问题来啦? 可不可以直接使用Throwable? 首先使用Throwable捕获异常,这在代码中没有任何问题,因为Throwable捕获都范围是最大的。但一般开发中是不会直接使用Throwable进行捕获的,对于Throwable来说有Exception、Error两个子类,Error类本身不需要程序处理,而程序中需要处理的只是Exception,所以没必要使用Throwable。 对于一个程序来说,如果有多个异常最好分别进行捕获,而不要直接使用Exception捕获全部异常。
了解throws与throw关键字
在定义一个方法时可以使用throws关键字声明,使用throws声明的方法表示此方法不处理异常,而交给方法的调用处进行处理,throws使用格式如下。
public 返回值类型 方法名称(参数列表...) throws 异常类{}
注意:不要在主方法中使用throws。
主方法为一切的起点,一切的操作也是主方法开始的。所以,如果在主方法中使用throws,则程序出现问题后肯定交由JVM进行处理,将导致程序中断。
throw关键字
与throw关键字不同的是,可以直接使用throw关键字人为地抛出一个异常,抛出时直接抛出异常类的实例化对象即可。
注意:finally语句块的编写要求
finally作为异常的统一出口,所以在此语句块的编写中尽可能不要出现像throw或return这样的语句,这样可以避免不必要的问题出现。
Exception类与RuntimeException类
在java面试中经常会问Exception类与RuntimeException类的区别。 我们来看下边的代码。
public static void main(String[] args) throws Exception{
String str = "123";
int temp = Integer.parseInt(str);
System.out.println(temp*temp);
}
我们看一下parseInt方法
public static int parseInt(String s) throws NumberFormatException
方法throws 在声明时使用throws关键字,但是在方法调用时并没有使用try...catch进行处理,这是为什么呢?看一下NumberFormatException类的继承关系,
Exception--RuntimeException--lllegalArgumentException--NumberFormatException
Exception在程序中必须使用try--catch进行处理。 RuntimeException可以不使用try--catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。 提示:对于RuntimeException的子类最好也使用异常处理机制。 虽然RuntimeException的异常可以不用try...catch进行处理,但是如果一旦处理异常,则肯定会导致程序中断执行,所以,为了保证程序在出错后依然可以执行,所以在开发代码时最好使用try...catch的异常处理机制进行处理。
自定义异常类 在java中已经提供了大量的异常类,但是这些异常类有时也很难满足开发者的要求,所以用户可以根据自己的需要来定义自己的异常类。定义异常类只需要Exception类即可。
断言
在JDK1.4之后,java中增加类断言的功能。断言是肯定某一个结果的返回值是正确的,如果最终此结果的返回值是错误的,则通过断言检查肯定会提示错误信息。断言的定义格式如下
assert boolean 表达式
assert boolean 表达式:详细的信息
开发中不提倡使用断言。