Java笔记(2)-java的异常处理机制

Java的异常机制主要依赖于try、catch、finally、throw、throws五个关键字
其中try关键字紧跟花括号,简称try块,里面放置可能引起一异常的代码
catch后可以对应异常类型和代码块,用于表明catch块用于处理这种类型的代码块,
多个catch块后可以跟一个finally块,用于回收try块打开的物理资源,Java的异常机制会保证finally块总被执行
throws关键字主要在方法签名里使用,用于声明该方法可能跑出的异常
throw关键字用于抛出一个实际的异常,throw可以作为单独语句,抛出一个具体的异常对象。

开发者希望所有的异常编译的时候就可以全部找到,但这是不现实的,有些异常必须是在运行期间才会出现并且需要被解决。
因此java异常分为两种,Checked异常和Runtime异常,Java认为Check异常都是可以在编译阶段被处理的异常,所以在编程的时候程序必须已经处理所有的Checked异常,而Runtime异常无需处理。

对于开发程序来说,不能想着只做对的事情,还要考虑各种错误怎么办。

异常处理机制

异常处理机制的前身是错误处理代码,你可以假设可能出现的错误情况,然后分别去解决,这样的问题是:
1. 无法穷举所有的异常或者错误情况
2. 错误处理代码和业务实现代码混杂

Java的异常处理机制能够让程序具有更好的容错性,程序能面对更加复杂的情况。
运行情况,其实无论代码是否在try块中,只有出现异常,系统总会自动生成一个异常对象,如果代码没有用 catch块捕捉,Java就无法找到处理异常的方法,程序就会退出;如果可以找到合适的catch块,就把异常交给他,我们认为异常被捕捉了。

java捕捉异常那个会依次判断异常对象是否是catch块里异常类或者其子类的对象,如果是,执行该catch块,否则交给下一个catch块。先处理小异常,在处理大异常

java定义里丰富的异常类,这些异常类有严格的继承关系。
java把所有的非正常情况分为两种,异常(Exception)和错误(error),他们都继承Throwable父类

Error错误一般是于虚拟机相关的问题,比如系统崩溃,虚拟机错误,动态链接失败等,无法捕捉无法恢复。

常见的异常包括:数组越界异常,数字格式异常,除0异常,调用null对象的异常,
java7的多异常捕捉:catch(Exception1 | Exception2 | Exception3 e){}

访问异常信息

catch块的异常相关信息,通常使用printStackTrace(),将异常的跟踪栈信息输出到标准输出,跟踪栈就是那种一行一行可以看哪里出错的信息

finally回收资源

因为java的垃圾回收机制是针对jvm中的堆内存来说的,因此其不会回收任何物理资源(比如数据库连接,网络连接、磁盘文件读写都是物理资源,需要显式回收,例如文件关闭、数据库关闭等等)

这样会看的很臃肿,例如在try里面建立输入输出流,在catch中捕捉有可能文件不存在的异常,在finally里说显式关闭这个文件。java7改变了,7增强了try语句的功能——允许try关键字后经嗯一堆圆括号,初始一些资源(必须在程序结束时显式关闭,比如数据库和网络的连接),在这种情况下,为了保证太容易语句可以正常关闭资源,这些资源必须实现AutoClosable或Closable接口。

java7中基本把所有的IO类、JDBC相关接口都实现了。

Checked异常和Runtime异常:严谨的设计哲学

所有的RuntimeException异常以及子类的异常被称为Runtime异常,其他的都是checked异常。
Java 必须显式的处理checked的异常,这样才会通过编译。

throws声明抛出异常,多个异常用逗号隔开。
throw可以让程序自行抛出异常。 throw new Exception()
自定义异常类,继承Exception类,两个构造方法。

java的异常跟踪栈

可能第一次看到异常跟踪栈,你可能会惊慌失措,它实际的信息是非常清晰的记录了应用程序中执行停止的哥哥点。它第一行的信息详细显示了异常的烈性和异常的详细信息,其实十分方便

异常的误区

  1. 不要过度使用异常,不能一味地不编写错误代码,凡事都是异常处理,更不能用异常代替流程控制。异常处理机制的初衷是将不可预期的异常 的处理代码和正常的业务员逻辑处理代码分离,用异常处理流程是很慢的。比如ArrayIndexOutOfBoundsException异常,永远不要想着去try-catch
  2. 不要使用庞大的try块,应该大的try块分割成多个可能出现异常的程序段落。分别捕获处理
  3. 避免使用catch All语句,不要想着用Throwable t去捕捉所有异常,这样什么都会看不到
  4. 不要忽略捕捉到的异常,不要在catch留空,或者仅仅打印错误跟踪栈信息,要进行处理0/‘’。

发表评论

电子邮件地址不会被公开。