Java异常学习笔记

时间:2023-02-25 21:16:38

1.异常处理机制

Java中将有可能会出现异常的代码块放到try{}中,当执行时try中的代码真的出现异常,则系统会自动生成一个异常对象,该异常对象提交给Java运行环境,这个过程被称为抛出异常(throw).

当Java运行环境收到异常对象,会寻找该异常对象对应的catch块,如果找到就进行处理,这个过程被称为捕获异常。

如果没有找到,则程序结束。

2.异常的继承体系:

 Java异常学习笔记

Java把所有的非正常情况分成两种:异常(Exception)和错误(Error),他们都继承Throwable父类。

    Error错误,一般是指与虚拟机相关的问题,如系统奔溃、虚拟机错误、动态链接失败等,这种错误无法恢复或不可能捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不应该试图使用catch块来捕获Error对象。在定义该方法是也无须在其throws子句中声明该方法可能抛出Error及其任何子类。这类异常主要是和硬件有关的,而不是由程序本身抛出的。

 

     Exception是Throwable的一个主要子类。Exception下面还有子类,其中一部分子类分别对应于Java程序运行时常常遇到的各种异常的处理,其中包括隐式异常。比如,程序中除数为0引起的错误、数组下标越界错误等,这类异常也称为运行时异常,因为它们虽然是由程序本身引起的异常,但不是程序主动抛出的,而是在程序运行中产生的。

一些主要子类对应的异常处理功能简要说明如下:


    ArithmeticException——由于除数为0引起的异常;

    ArrayStoreException——由于数组存储空间不够引起的异常;

    ClassCastException—一当把一个对象归为某个类,但实际上此对象并不是由这个类 创建的,也不是其子类创建的,则会引起异常;

    IllegalMonitorStateException——监控器状态出错引起的异常;

    NegativeArraySizeException—一数组长度是负数,则产生异常;

    NullPointerException—一程序试图访问一个空的数组中的元素或访问空的对象中的 方法或变量时产生异常;

    OutofMemoryException——用new语句创建对象时,如系统无法为其分配内存空 间则产生异常;

    SecurityException——由于访问了不应访问的指针,使安全性出问题而引起异常;

    IndexOutOfBoundsExcention——由于数组下标越界或字符串访问越界引起异常;

    IOException——由于文件未找到、未打开或者I/O操作不能进行而引起异常;

    ClassNotFoundException——未找到指定名字的类或接口引起异常;

CloneNotSupportedException——一程序中的一个对象引用Object类的clone方法,但 此对象并没有连接Cloneable接口,从而引起异常;

 

注意的是: 一定要先捕获小异常,再捕获大异常,否则,大异常子在前已经捕获了,后边的就不会执行,

<span style="font-size:18px;">public class ExceptionTest1 {
public static void main(String[] args) {
try{

int a = 0;
int b = 1;
int c = b/a;
System.out.println(c);
}catch(ArithmeticException e){
System.out.println("first");
}catch(Exception e){
System.out.println("second");
}
}
}
</span>


如果上述的两个异常交换位置,则只会出现second

 

Java7提供了多异常捕获,也就是说一个catch后边可以有多个异常类型,但是用 | 隔开

 

<span style="font-size:18px;">public class ExceptionTest1 {
public static void main(String[] args) {
try{

int a = Integer.parseInt(args[0]);
int b = Integer.parseInt(args[1]);
int c = a/b;
System.out.println(c);
}catch(IndexOutOfBoundsException|NumberFormatException|ArithmeticException e){
System.out.println("first");
e = new ArithmeticException ("第一句");
}catch(Exception e){
System.out.println("未知异常");
e = new RuntimeException ("第二句");
}
}
}</span>

则,第一句的位置会报错,但是第二句正常

因为捕获多种异常时,异常变量使用隐式的final修饰,但是只有一种变量时,没有final修饰。


4.访问异常信息


如果在程序中需要访问异常对象的相关信息,则可以通过以下的方法,所有异常都包含了以下方法:

getMessage()  //返回该异常的详细描述

printStackTrace()  //将该异常的跟踪栈信息输出到标准错误输出

printStackTrace(PrintStream s)  //将该异常的跟踪栈信息输出到指定输出流

getStractTRace()   //返回该异常的跟踪栈信息

 

5.finally 用来回收资源

关于这块当catch和finally同时又return时的返回结果见我上一篇博客

http://blog.csdn.net/dadaxiongdebaobao/article/details/52199959


6.总结

Ecxeption又分为RuntimeException和checked异常,

对于checked异常,有两种处理方法:

(1):如果方法知道该如何处理该异常,则在catch块中处理。

(2):如果不知道怎么处理,则在定义该方法时申明抛出异常。用throws


由于checked异常必须显式捕获或者抛出,所以建议使用runtimeException更简单。因为RuntimeException无需显式申明。