JAVA异常机制简述
1.类的继承结构
在JAVA所有的异常对象都是Throwable类的一个子类的实例
Exception包含两个分支,由于程序错误导致的异常属于RuntimeException,比如数组下标越界,空指针等。非程序本身问题的异常属于其他异常,譬如IO引起的异常。
派生自Error类或RuntimeException类的所有异常都属于为检查异常,而其他所有的异常都属于已检查异常,我们只需要为已经常异常指定异常处理器即可,换句话说,原则上,我们只需要为已检查异常编写catch语句。
2.方法异常的声明
方法在其首部应该声明所有可能抛出的异常
String readData(Scanner in)throw EOFException { //... }
3.异常的抛出
String readData(Scanner in)throw EOFException { while(){ if(){ throw new EOFException(); } } }
4.方法的捕获
如果A方法调用了声明了抛出异常的B方法,那么在A方法中要么处理这个异常,要么继续将这个异常抛出。
try{ //... } catch(FileNotFoundException e) { //... } catch(IOException e){ //... } finally { file.close(); }
5.finally子句已经带资源的try语句
在上面代码中,我们使用了finally子句来进行文件关闭的操作,这在实际开发过程中是比较常见的需求,由于无论try语句块中是否出现异常,finally子句中的语句都会被执行,所以在finally子句进行文件关闭、流关闭以及数据库关闭等操作是一个比较好的选择,避免了try语句块内外编写重复的代码。
此外,另一种较好的选择是使用带资源的try语句,由于带资源的try会在退出(无论正常退出还是异常发生)时,自动调用res.close(),所以我们在不编写finally语句的情况下依然可以进行文件关闭等操作。
try(Scanner in = new Scanner(new FileInputStrem("/usr/tmp/test"))){ while(in.hasNext()) System.out.println(in.next()); }