java异常的概念
概念:程序在运行时可能出现的一些错误称为异常,它中断了正在执行的程序的正常指令流。
体系如下:参考 这篇文章,注意Exception和Error的区别
检查异常:一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应
该为这样的异常时刻准备着。eg:IOException,SQLException,ClassNotFoundException等
非检查异常(即RuntimeException):编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理这样的
异常,也可以不处理。eg:NullPointerException,ArrayIndexOutOfBoundsException,ArithmeticException,ClassCastException等
try-catch-finally语句捕获异常
1 try{ 2 //一些会抛出的异常 3 }catch(Exception e){ 4 //第一个catch 5 //处理该异常的代码块 6 }catch(Exception e){ 7 //第二个catch,可以有多个catch 8 //处理该异常的代码块 9 }finally{ 10 //最终要执行的代码 11 }
几点说明要记住:
- try块中的局部变量和catch块中的局部变量(包括异常变量),以及finally中的局部变量,他们之间不可共享使用。
- 每一个catch块用于处理一个异常。异常匹配是按照catch块的顺序从上往下寻找的,只有第一个匹配的catch会得到执行。匹配时,不仅运行精确匹配,也支持父类匹配,因此,如果同一个try块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个catch块都有存在的意义。
- finally块不管异常是否发生,只要对应的try执行了,则它一定也执行。只有一种方法让finally块不执行:System.exit()。因此finally块通常用来做资源释放操作:关闭文件,关闭数据库连接等等。
throws和throw抛出异常
抛出的意思是:某个方法可能发生异常,但不想在这个方法中处理异常,就可以将异常向上抛出,由方法的调用者来处理。
throws的使用
throws关键字通常被应用与声明方法时,用来指定方法可能抛出的异常,多个异常可用于逗号分隔,如下:
1 public void 方法名(参数列表) 2 throws 异常列表{ 3 //程序过程 4 }
两点要注意:
- 如果是检查异常,调用时必须用try-catch的方法来执行;如果是RuntimeException,可以不用throws抛出,仍能通过编译,但运行时会被系统抛出;
- 将异常抛给上一级后,如果不想处理该异常,可以继续向上抛出,但注意上一级的调用函数也要写出throws的样子,且最终要有处理该异常的代码;
throw的使用
throw 语句必须写在函数中,单独使用执行throw 语句的地方就是一个异常抛出点,它和由JRE自动形成的异常抛出点没有任何差别。eg:
1 public void save(User user) 2 { 3 if(user == null) 4 throw new IllegalArgumentException("User对象为空"); 5 //...... 6 7 }
通过throw抛出异常后,如果要在上一级来捕获并处理(即try-catch)异常,则需要在抛出异常的方法中使用throws关键字在方法中声明中指明要抛出的异常.
如果抛出的是RuntimeException则既可以显示使用try…catch捕获也可以不理会它 ;如果是检查异常,调用时必须用try-catch的方法来执行。eg:
1 public class ThrowTest { 2 public static void main(String[] args) { 3 try{ 4 throwChecked(3); 5 }catch(Exception e) { 6 System.out.println(e.getMessage()); 7 } 8 throwRuntime(-3); 9 } 10 //该方法内抛出一个Exception异常对象,必须捕获或抛给调用者 11 public static void throwChecked(int a) throws Exception { 12 if(a < 0) { 13 throw new Exception("a的值应大于0,不符合要求") 14 } 15 } 16 //该方法内抛出一个RuntimeException对象,可以不理会直接交给JVM处理 17 public static void throwRuntime(int a) { 18 if(a < 0) { 19 throw new RuntimeException("a的值应大于0,不符合要求") 20 } 21 } 22 }
throws和throw的区别总结:
- throws出现在方法函数头;而throw出现在函数体。
- throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
- 两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
自定义异常
如果要自定义异常类,则扩展Exception类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
先继承,再调用!!!!!


浙公网安备 33010602011771号