读书人

张龙 Exception学习札记

发布时间: 2012-10-24 14:15:58 作者: rapoo

张龙 Exception学习笔记

1.Java中的异常分为两大类:
a) Checked exception (非 Runtime Exception)
b) Unchecked exception(Runtime Exception)

?

2.Java中所有的异常类都会直接或间接地继承自Exception,RuntimeException类也是直接继承自Exception类,它叫做运行时异常,Java中所有的运行时异常都会直接或间接地继承自RuntimeException,Java中凡是继承自Exception而不是继承RuntimeException的类都是非运行时异常。

?

3.异常处理的一般结构是:
try
{
}
catch(Exception e)
{
}
finally
{
}
无论程序是否出现异常,finally块中的代码都是会被执行的。

?

4.对于非运行时异常(checked exception),必须要对其进行处理,处理方式有两种:第一种是使用try.. catch…finally进行捕获;第二种是在调用该会产生异常的方法所在的方法声明throws Exception

举例1:ExceptionTest.java

?

package com.shengsiyuan.exception;public class ExceptionTest{public static void main(String[] args){int c = 0;try{int a = 3;int b = 0;c = a / b;System.out.println("hello world");}catch(ArithmeticException e){e.printStackTrace();}finally{System.out.println("welcome");}System.out.println(c);}}

?

举例2:ExceptionTest2.java

?

package com.shengsiyuan.exception;public class ExceptionTest2{               //在方法声明的时候要抛出异常使用的是throws关键字public void method() throws Exception{System.out.println("hello world");                //在方法体要抛出异常里面使用的是throw关键字                //方法体里面一旦出现了throw关键字,方法定义的时候就必须跟着throws关键字,否则会报错throw new Exception();}public static void main(String[] args){ExceptionTest2 test = new ExceptionTest2();try{test.method();}catch(Exception e){e.printStackTrace();}finally{System.out.println("aaa");}}}

??

5.对于运行时异常(runtime exception),我们可以不对其进行处理,也可以对其进行处理。推荐不对其进行处理。

6.NullPointerException是空指针异常,出现该异常的原因在于某个引用为null,但你
却调用了它的某个方法。这时就会出现该异常。

?

举例:ExceptionTest3.java

?

package com.shengsiyuan.exception;public class ExceptionTest3{public static void main(String[] args){String str = null;System.out.println(str.length());}}

?

7.所谓自定义异常,通常就是定义了一个继承自Exception类的子类,那么这个类就是一个自定义异常类。通常情况下,我们都会直接继承自Exception类,一般不会继承某个运行时的异常类,自定义异常一般是为了在标准异常里加入一些自己独特的信息。

8.我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,Java编译器会报编译错误;如果多个catch块的异常类型是独立的(MyException, MyException2), 那么谁前谁后都是可以的。

举例:?MyException,MyException2,Exception4

package com.shengsiyuan.exception;public class MyException extends Exception{public MyException(){super();}public MyException(String message){super(message);}}

?

package com.shengsiyuan.exception;public class MyException2 extends Exception{public MyException2(){super();}public MyException2(String message){super(message);}}

?

package com.shengsiyuan.exception;public class ExceptionTest4{public void method(String str) throws Exception{if(null == str){throw new MyException("传入的字符串参数不能为null");}else if("hello".equals(str)){throw new MyException2("传入的字符串不能为hello");}else{System.out.println(str);}}public static void main(String[] args){try{ExceptionTest4 test = new ExceptionTest4();test.method("hello");}catch(MyException e){System.out.println("进入到MyException catch块");e.printStackTrace();}catch(MyException2 e){System.out.println("进入到MyException2 catch块");e.printStackTrace();}catch(Exception e){System.out.println("进入到Exception catch块");e.printStackTrace();}finally{System.out.println("异常处理完毕");}System.out.println("程序执行完毕");}}

?

说明:

a)如果一个方法抛出了异常,另外一个方法调用这个方法的时候,可以有2种处理办法:要么try--catch--finally,要么继续往上抛,第一种处理方式容易理解,没什么好说的,如果是第二种处理方式,即继续往上抛,最高层可以抛到main方法,main方法可以捕获异常然后进行处理,也可以继续往外抛,此时,是抛给JVM去进行处理了。
????继续往上抛与try--catch的区别是如果程序执行过程中发生异常,处理方式如果为往上抛的话程序就不会继续往下执行,就在发生异常的地方中止了,后面的代码不会执行,如果是try--catch,发生异常后程序进入catch,执行完后会接着执行下面的代码,也就是说就算发生异常,程序也不会中止执行,依然会跑下去。

?

b)关于自定义异常:实际项目中经常要用到自定义异常,一般使用情况是程序抛出了一个java预定义的异常,我们??catch住后,将该异常包装为自定义的异常,然后抛出去,这样我们写的方法声明的时候就只会抛自定义的异常,而不会再去抛java自带的异常。

?

9.Exception常见面试题

?? 举例:ExceptionTest5

??

package com.shengsiyuan.exception;public class ExceptionTest5{public void method() {try{System.out.println("进入到try块");                        //return                         System.exit(0);}catch(Exception ex){System.out.println("异常发生了");}finally{System.out.println("进入到finally块");}System.out.println("异常处理后续的代码");}public static void main(String[] args){ExceptionTest5 test = new ExceptionTest5();test.method();}}

?

?说明:

?a)如果在try代码块里出现了return,那程序执行到return时并不会立即return,而是会继续把finally代码块里面的代码?执 行完,然后返回,切记。

?b)如果try块中存在System.exit(0)语句,那么就不会执行finally块中的代码,因为System.exit(0)会终止当前运行的Java虚拟机,程序会在虚拟机终止前结束执行。

???????

读书人网 >编程

热点推荐