Java回炉之异常处理
try-catch
try{
}catch(XxxException e){
}
try-catch-catch…
try{
}catch(AException ae){
}catch(BException be){
}
//...
try-catch-finally
- 如果catch中有return,则return前会执行finally中的代码,但**不影响**return的内容。
- 如果finally中有return,则catch中的return不执行。
try{
}catch(Exception e){
}finally{
}
try-catch(E|E…)
try{
}catch(AException | BException | CException e){
}
try-resource
try {
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
fw.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
// 改进版的代码
try (FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");) {
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
} catch (IOException e) {
e.printStackTrace();
}
Exception
- getMessage():返回异常的详细信息
- toString():返回异常的简单描述。包括异常全类名、getLocalizedMessage()的返回
- getLocalizedMessage():默认为getMessage()
- printStackTrace():获取异常类名和异常信息,以及异常在程序中的位置。返回void
- printStackTrace(PrintStream):将异常内容保存到日志文件中
throws
抛出自身处理不了的可能出现的异常类
- 写在方法声明后面,跟的是异常类名
- 可以跟多个类名,用逗号隔开
- 异常由该方法的调用者处理
- 可能但不一定会发生异常
public void method() throws Exception{}
throw
运行时抛出遇到的异常对象
- 写在方法体中,跟的是对象
- 只能抛出一个对象
- 异常由方法体内的语句处理
- 表示此处已经抛出异常
public void method() throws Exception{
//...
throw new Exception();
//...
}
public void method(){
//...
try{
//...
throw new Exception();
}catch(Exception e){
//...
}
//...
自定义异常
public class ExText extends Exception{}
- 子类重写父类方法时,子类方法必须抛出相同异常或其子类异常。
- 如果父类方法抛出多个异常,子类重写时只能抛出相同的多个异常或其子集,不能抛出父类方法没有抛出的异常。
- 如果父类方法没有抛出异常,子类重写该方法则不能抛出异常。