异常
Error
描述了Java
运行时系统内部错误和资源耗尽
捕获
捕获处理错误
try{
}
catch(Exception e){
e.getMessage()
}
catch(E1 | E2 e2){}
finally{}
可以有多个catch
;同一个catch
语句可以捕获多个异常类型(一次一种),但不能为子类关系,同时异常对象为final
;可以有finally
,其最后执行
抛出
- 找到合适异常类
- 创建其对象
throw
对象
public void getFileStream throws IOException,...{
EOFException e = new EOFException();
throw e;
//或
try{}
catch(...){
throw new Exception();
}
}
异常再抛出 | 异常链
捕获异常后对其处理或做其它动作后抛出,捕获中第二种在catch
中抛出形式。
可以转换异常类型,添加日志行为后再抛出
传递异常原因
try{
p1();
}
catch (IOException IOException){
Exception e = new Exception("Other Exception");
e.initCause(IOException.getCause());
throw e;
}
创建异常类
继承Exception
或其子类
class TestException extends Exception{
public TestException(){}
//Throwable类有存储错误信息属性
public TestException(String s){
super(s);
}
}
finally
无论是否有异常,都执行
try{}
catch(...){}
finally{}
若处理文件流,可以将流的关闭放在
finally
,但关闭语句也可能产生错误,因此需要嵌套try
语句,显得混乱。而且若finally块也产生异常,只会报告最后那个异常,致使无法了解详细情况
return
如果try
与finally
语句块中都有return
语句,在try
语句块中通过return
返回时,依然会调用finally
,而finally
中的返回值会覆盖原来值
public class K {
public static void main(String[] args) {
System.out.println(p());
}
public static int p(){
try {
int a = 5;
return a*3;
}catch (Exception e){
System.out.println(e.getMessage());
}
finally{
return 89;
}
}
}
try-with-source
在try
块退出后自动关闭资源
传入对象需实现
AutoCloseable
接口
try(FileInputStream f = new FileInputStream(new File(""))){
} catch (IOException e) {
e.printStackTrace();
}
可以指定多个资源
try(FileInputStream in = new FileInputStream(new File(""));
FileOutputStream out = new FileOutputStream(new File(""))){
} catch (IOException e) {
e.printStackTrace();
}
也可以带catch,finally
,但不推荐
关闭资源若产生异常,不会覆盖try
块中异常
Throwable
返回类型 | 方法 | 说明 |
---|---|---|
Throwable | initCause(Throwable t) | 设置错误原因 |
Throwable | getCause() | 获取错误原因 |
StackTraceElement[] | getStackTraces() | 获得构造这个对象时调用堆栈的信息 |
void | addSuppressed(Throwable t) | 添加“抑制异常” |
Throwable[] | getSuppressed() | 获取“抑制异常” |
示例
package cc;
import java.io.*;
import java.nio.file.FileSystemNotFoundException;
import java.util.Map;
public class K {
public static void main(String[] args) {
try {
p1();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void p1() throws Exception {
try {
p2();
}
catch (Exception e){
FileNotFoundException a1 = new FileNotFoundException();
FileSystemNotFoundException a2 = new FileSystemNotFoundException();
e.addSuppressed(a1);
e.addSuppressed(a2);
throw e;
}
}
public static void p2() throws Exception {
throw new Exception();
}
}
/*
java.lang.Exception
at cc.K.p2(K.java:28)
at cc.K.p1(K.java:17)
at cc.K.main(K.java:10)
Suppressed: java.io.FileNotFoundException
at cc.K.p1(K.java:20)
... 1 more
Suppressed: java.nio.file.FileSystemNotFoundException
at cc.K.p1(K.java:21)
... 1 more
*/
Tip
- 尽可能详细描述异常
- 合理地包含要捕获异常代码
- 向高层次传递错误,而不是在基础方法中捕获错误