《Java核心技术》第七章读书笔记(异常处理)

第七章 异常断言日志

所有的异常(Error和Exception)都是由Throwable继承而来。

异常分类

Java将派生于Error类或RuntimeException类的所有异常称之为非受查异常,其他的称之为受查异常。

声明受查异常

以下4种情况应该抛出异常

  1. 调用一个抛出受查异常的方法,比如FileInputStream构造器
  2. 程序运行过程中发现错误,并且利用throw语句抛出一个受查异常。
  3. 程序出现错误的非受查异常,例如索引越界。
  4. java虚拟机和运行时库出现的内部错误。

对于受查异常,必须告诉程序员有可能抛出异常,如果没有处理器捕获这个异常,当前执行的线程就会结束。

不需要声明java的内部错误,即从Error集成的错误,任何程序代码都具有哪些抛出异常的潜能,而我们对其没有任何控制能力。同样也不应该声明从RuntimeException继承的那些非受查异常。比如索引越界。

这些错误完全在我们控制之下,我们应该花费时间在程序的修正上而不是错误发生的可能性上。

总之一个方法必须声明所有可能抛出的受查异常,而非受查异常要么不可控制,要么就应该避免发生,如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误。

创建异常类

例如,定义一个派生于IOException的类,习惯上,定义的类应该包含两个构造器,一个是默认的构造器,另一个是带有详细描述信息的构造器。

class FileFormatException extends IOException{
	public FileFormatException(){};
	public FileFormatException(String grip){
		super(grip)
	}
}

在方法中抛出自定义的异常即可。

再次抛出异常与异常链

catch字句可以抛出一个异常,目的是改变异常的类型。

try{access the database}
catch(SQLException e){
	Throwable se = new ServletException("database error")
	se.initCause(e);
	throw se
}

当捕获到异常时
Throwable e = se.getCause()获取原始异常,而且不会丢失原始异常细节。
  • 在try-catch-finally中,finally会在return之后继续执行。

带资源的try语句

try(Scanner in = new Scanner(new FileInputStream("xxxxx")),"utf-8"){
	while (in.hasNext()){
		doSometh;
	}
}

这个块正常退出时,或者存在一个异常时,都会调用in.close()方法。

posted @ 2020-11-01 13:56  Jimmyhe  阅读(109)  评论(0编辑  收藏  举报