Java异常处理机制

来源:互联网 发布:南风知我意2百度云 编辑:程序博客网 时间:2024/06/16 00:41

     1Throwable

Throwable 有两个重要的子类:Exception(异常)和 Error(错误)

       Error(错误):是程序无法处理的错误,一般与 JVM相关的问题。如Java虚拟机运行错误(Virtual MachineError这些错误是不可查的

比如:StackOverFlowError和OutofMemoryError

       Exception(异常):是程序本身可以处理的异常。Exception 分为运行时异常和非运行时异常RuntimeException 类表示“JVM 常用操作引发的错误一般是由程序逻辑错误引起的。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerExceptionArithmeticException)和 ArrayIndexOutOfBoundException、ClassNotFoundException、IllegalArgumentException

   注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。

      除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

     不可查异常:包括运行时异常(RuntimeException与其子类)和错误(Error)。


   2、异常处理机制

(1)Try...catch...finally捕获

注意:1一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会

2)catch()中的异常类型可以为多种异常类型,之间用|隔开,这种情况下,异常变量有隐式的final修饰,所以不能对其重新赋值,如:

Try{...}catch(IOException | SQLException  e){

System....(e.print...)//OK 

e=new ArithmeticException(test);// 捕获出现异常,final变量不允许重新赋值

}

3)Catchfinally是可选的,二者至少出现一个。

4)匹配异常应该先子类异常,再基类异常。

4)除非在try块或者匹配的catch中调用虚拟机退出方法,如:System.exit(),否则finally一定会执行,即时前两者里有return,也会执行,并且在return之前执行。

5)Java的垃圾回收器只回收堆中资源,不释放物理资源,所以很多物理资源的释放在finally中进行,比如关闭文件。

6)自动关闭资源的try块,try后跟一对括号,隐式包含了finally,不用包括catchfinally

(2)Throws抛出异常

抛出的异常层层向上,直到main方法也不知如何处理,抛给jvm

单线程是由main方法抛出,多线程由Thread.run抛出。

Throw是抛出一个异常实例,不是异常处理机制,如throw new MyException(test);

3当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU

 3、自定义异常

 

class MyException extends Excetpion{     public MyException( String msg){           super(msg);}}。。。if(x<0) throw new MyException("例子")

 

 4、其他

(1)多个方法协同处理异常,可以在catch(Exception e)块里throw new NewException(“新的异常”);

(2)异常链就是异常分层,底层数据库异常留给管理员,抛出定义的新异常给中间层,中间层也是如此,保留异常抛出新异常。

 

原创粉丝点击