1. Java异常补充
a.使用try/catch捕获了异常之后,catch之后的代码是会正常运行的,这是很多新手会犯的错误。
public class ExceptionTest { public static void main(String [ ] args) { try{ throw new RuntimeException(); }catch(Exception e){ e.printStackTrace(); } System.out.println("still operate here!"); } }
将输出:
java.lang.RuntimeException
still operate here!
at exception.ExceptionTest.main(ExceptionTest.java:20)
b.捕获多个异常时,一旦匹配将退出,因此捕获Exception时应该放到最后,否则连编译都通不过
public class ExceptionTest { public static void main(String [ ] args) { try{ throw new RuntimeException(); }catch(Exception e){ e.printStackTrace(); }catch(RuntimeException e){ e.printStackTrace(); } System.out.println("still operate here!"); } }
在catch(RuntimeException e){这一行会报错:
unreachable block for RuntimeException.It is handled by the catch block for Exception。
正确的顺序是先捕获RuntimeException,再尝试捕获Exception。
c.告诉调用方法的调用者可能会抛出异常,可以在方法后面加上throws,然后在方法中thorw。这样别人再调用该方法时就必须处理该异常或者抛出该异常。
下面是BufferedInputStream中的例子:
private byte[] getBufIfOpen() throws IOException { byte[] buffer = buf; if (buffer == null) throw new IOException("Stream closed"); return buffer; }
需要注意的是,方法后面加上throws,方法内部不一定非要thorw。
下面是InputStream中的例子:
public int available() throws IOException { return 0; }
d.捕获异常时,子类的异常也可以被父类的try/catch所捕获。
public class ExceptionTest { public static void main(String [ ] args) { try{ throw new SubException(); }catch(MyException e){ e.printStackTrace(); } } } class MyException extends Exception{} class SubException extends MyException{}
将会输出:
exception.SubException
at exception.ExceptionTest.main(ExceptionTest.java:15)
注意只能先捕获子类异常,再捕获父类异常。
e.将检查时异常变为运行时异常
如果调用的方法抛出了一个异常,我们在调用时就需要进行处理,如果不知道怎么处理,又不想catch之后什么都不做(这样是很不好的),可以向上抛出异常或者抛出运行时异常。
public class ExceptionTest { public static void main(String [ ] args) throws IOException{ try{ InputStream is = new FileInputStream(new File("abc.txt")); is.read(); }catch(IOException e){ //e.printStackTrace(); //throw e; //自己无法处理时向上抛出 throw new RuntimeException(e); } } }
注意,如果方法内throw,则需要再次捕获或者方法上throws。