Java违例学习
1产生一个违例时,首先,按照与创建Java 对象一样的方法创建违例对象:在内存“堆”里,使用new 来创建。随后,停止当前执行路径(记住不可沿这条路径继续下去),然后从当前的环境中释放出违例对象的句柄。此时,违例控制机制会接管一切,并开始查找一个恰当的地方,用于继续程序的执行。这个恰当的地方便是“违例控制器”,它的职责是从问题中恢复,使程序要么尝试另一条执行路径,要么简单地继续。
2 违例更重要的信息保存在违例类型中,而不是违例对象中。
3 如果在当地捕获了抛出的违例需要在本地是用try catch语句,而要抛给更高级的处理器处理则在方法后面加上throws Exception...
4 Exception的直接父类是Throwable,这个类中有printStackTrace()方法打印抛出异常的路径。。
5 注意e.fillInStackTrace()的返回值是Throwable对象,所以可能不被捕获Exception的捕获器捕获。另外fillInStackTrace()方法返回的是新的抛出路径!
6 RuntimeException是java语言内置的,所以永远不必担心运行期java异常。
7 覆盖一个方法时只能产生在方法基础类版本中定义的违例,这样在实现多态时不必修改源代码,更重要的是与基础类协同工作的代码自动可以与基础类衍生的类协调工作,而覆盖子类方法的时候当然不必一定抛出父类可能抛出的异常。
8 构造方法可以抛出任意类型的异常!
9 在没有“垃圾回收”和“自动调用析构方法”的语言中finally是十分重要的,因为需要手动回收占用的内存等资源;而在含有垃圾回收机制的语言中finally长用来做关闭文件,释放网络连接等任务。此外,如果违例不在当前catch语句中捕获,finally语句块会在违例转到更高级别控制器之前执行。
10 注意关闭文件或网络连接等操作不应该在finally中执行,因为可能尚未创建成功:
class InputFile {
private BufferedReader in;
InputFile(String fname) throws Exception {
try {
in =new BufferedReader(
new FileReader(fname));
// Other code that might throw exceptions
} catch(FileNotFoundException e) {
System.out.println("Could not open " + fname);
// Wasn't open, so don't close it
throw e;
} catch(Exception e) {
// All other exceptions must close it
try {
in.close();
} catch(IOException e2) {
System.out.println("in.close() unsuccessful");
}
throw e;
} finally {
// Don't close it here!!!
}
//other methods
}