JDK7之后推出了一个新的特性:自动关闭 JDK7之后的这个特性允许我们将需要关闭的内容 定义在try后面的"()"当中,但是需要注意,只有 实现了AutoCloseable接口的类可以在这里定义。 剩下的还是应当在try语句块中定义,否则会出现 编译不通过的情况。
该特性是编译器认可,当编译成class文件后,还是在finally中将流关闭的。
try { System.out.println("----"); String string = null; string.length(); System.out.println("===="); } catch (NullPointerException e) { System.out.println(">NullPointerException"); } catch (Exception e) { System.out.println("Exception"); }finally块是异常处理机制的最后一块,可以直接跟在try或最后一个catch之后。 finally可以保证只要代码执行到try当中,无论try语句块中的代码是否抛出异常,finally块中的内容都必定执行。
所以我们通常将释放资源这类操作放在这里确保运行.
finally { System.out.println("finally"); }异常抛出
当我们调用一个含有throws声明异常抛出的方法时,编译器要求我们必须处理该异常,而处理异常的方式有两种: 1:使用try-catch捕获并处理抛出的异常类型 2:在当前方法上继续使用throws声明异常的抛出具体使用哪种,结合实际业务需求而定。
通常一个方法中使用throw抛出什么异常,就要在方法声明时使用throws声明这个异常的抛出。只有RuntimeException是个例外。
使用throw关键字可以对外抛出一个异常 throw new IllegalAgeException(“年龄不合法!”);
自定义异常
自定义异常 自定义异常通常是用来定义我们程序中一些业务逻辑错误。
比如:年龄不合法异常
自定义异常需要: 1:定义异常的类名,这个最重要,应当做到通过该异常的类名能大致判断出因为什么原因会引起这个异常 2:需要继承Exception,或它的子类。 3:提供序列化版本号(eclipse生成即可) 4:提供所有构造方法(与Exception定义的构造方法一样) 这个也可以通过eclipse生成。