我是搬运工:http://www.importnew.com/26613.html
Java异常的分类
例子:除数为零的异常
解释:
异常线程 “main” 计算异常:/ 除数为零
在 com.example.AllDemo 类下 devide 方法 (AllDemo.java 文件第 30 行) 异常抛出点
在 com.example.AllDemo 类下 CMDCalculate 方法 (AllDemo.java 文件第 22 行)
在 com.example.AllDemo 类下 main 方法(AllDemo.java 文件第 12 行)
异常处理的基本语法
对于检查异常,有2种不同的处理方式:
1、try…catch…finally语句
2、使用 throws 声明交给函数调用者去解决
处理方法一:try…catch…finally语句块
try{
// try块中放可能发生异常的代码
}catch(Exception1 e1){
// 处理方法 1
}catch(Exception2 e2){
// 处理方法 2
}finally{
// 无论是否异常,最后都执行
}
需要注意的地方:
1、try 块中的局部变量、catch 块中的局部变量(包括异常变量)、finally 中的局部变量,他们之间不可共享。如果 try 中没有发生异常,则所有的 catch 块将被忽略
2、如果当前 try 块中发生的异常在后续的所有 catch 中都没捕获到,则先去执行 finally,然后到这个函数的外部 caller 中去匹配异常处理器
3、catch 块,异常匹配是按照 catch 块从上往下寻找的,只有第一个匹配的 catch 会得到执行。匹配时,不仅运行精确匹配,也支持父类匹配。因此,如果同一个 try 块下的多个catch异常类型有父子关系,应该将子类异常放在前面,父类异常放在后面,这样保证每个 catch 块都有存在的意义
4、finally 主要做一些清理工作,如流的关闭,数据库连接的关闭等
处理方法二:throws 与 throw
throws: 当调用者调用带有异常声明的方法时,需要对异常进行处理
public void foo() throws ExceptionType1 , ExceptionType2 ,ExceptionTypeN{
//foo内部可以抛出 ExceptionType1 , ExceptionType2 ,ExceptionTypeN 类的异常
//或者他们的子类的异常对象。
}
throw: 程序员也可以通过throw语句手动显式的抛出一个异常,throw语句的后面必须是一个异常对象
public void save(User user){
if(user == null)
throw new IllegalArgumentException("User对象为空");
//......
}
异常的注意事项
1、当子类重写的父类的带有 throws 声明的函数时,子类 throws 声明的异常必须在父类异常的可控范围内——用于处理父类的 throws 方法的异常处理器,必须也适用于子类的这个带throws方法 。这是为了支持多态
例如,父类方法 throws 的是2个异常,子类就不能 throws 3个及以上的异常。父类 throws IOException,子类就必须 throws IOException 或者 IOException 的子类。
2、finally 块和 return
在 try块中即便有 return,break,continue 等改变执行流的语句,finally 也会执行。如果 finally 中有 return,finally 的返回值会覆盖 try 或者catch中的返回值
建议:
不要在 finally 中使用 return;
不要在 finally 中抛出异常;
减轻 finally 的任务,不要在finally中做一些其它的事情,finally块仅仅用来释放资源是最合适的;
将尽量将所有的return写在函数的最后面,而不是 try … catch … finally 中
网友评论