- 使用 try 和 catch 关键字可以捕获异常。
- try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try {
// 程序代码
} catch(ExceptionName e1) {
//Catch 块
}
- catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
- 一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
多重捕获块的语法如下所示:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型2 异常的变量名3){
// 程序代码
}
2、throws/throw 关键字
如果一个方法没有捕获一个检查性异常,那么该方法必须使用throws 关键字来声明。throws 关键字放在方法签名的尾部。也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。
下面方法的声明抛出一个 RemoteException 异常:
public static void main(String[] args) throws InterruptedException {
Thread.sleep(123);
}
一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
3、fnally关键字- finally 关键字用来创建在 try 代码块后面执行的代码块。
- 无论是否发生异常,finally 代码块中的代码总会被执行。在finally 代码块中,可以运行清理类型等收尾善后性质的语句。
finally 代码块出现在 catch 代码块最后,语法如下:
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}finally{
// 程序代码
}
- 对于异常的使用有一个不成文的约定:尽量在某个集中的位置进行统一处理,不要到处的使用 try-catch,否则会使得代码结构混乱不堪。
- 按照我们程序员的惯性认知:当遇到return语句的时候,执行函 数会立刻返回。但是,在Java语言中,如果存在fnally就会有例外。除了return语句,try代码块中的break或continue语句也可 能使控制权进入fnally代码块。
- 请勿在try代码块中调用return、break或continue语句。万一无 法避免,一定要确保fnally的存在不会改变方法的返回值。
- 方法返回值有两种类型:值类型与对象引用。对于对象引用, 要特别小心,如果在fnally代码块中对返回的对象成员属性进行了修改,即使不在fnally块中显式调用return语句,这个修改 也会作用于返回值上。
第一,尽量不要捕获类似Exception这样的通用异常,而是应该捕 获特定异常。这是因为在日常的开发和合作中,我们读代码的机会往往超过写代码,软件工程是门协作的艺术,所以我们有义务让自己的代码能够直观地体现出尽量多的信息,而泛泛的Exception之 类,恰恰隐藏了我们的目的。另外,我们也要保证程序不会捕获到我们不希望捕获的异常。比如,你可能更希望RuntimeException 被扩散出来,而不是被捕获。
第二,不要生吞(swallow)异常。这是异常处理中要特别注意的 事情,因为很可能会导致非常难以诊断的诡异情况。生吞异常,往往是基于假设这段代码可能不会发生,或者感觉忽略异常是无所谓的,但是千万不要在产品代码做这种假设!如果我们不把异常抛出来,程序可能在后续代码以不可控的方式结束。没人能够轻易判断究竟是哪里抛出了异常,以及是什么原因产生了异常。
,