您的位置:首页 > 编程语言 > Java开发

Java回忆录(八)--------异常处理

2015-05-31 17:23 246 查看
Java异常主要分为Checked异常和RunTime异常,异常机制主要通过try、catch、finally、throw、throws来实现异常机制,从而让程序中异常处理代码和正常业务的代码分离,保证代码更加优雅,并可以提高程序的健壮性。try关键字后面紧跟一个花括号括起来的代码块,里面放置可能发生异常的代码。catch后对应异常类型和一个代码块,用于处理该类型的异常。finally紧随其后,用来回收try块里打开的物理资源。throws关键字主要用在方法签名中使用,用于声明该方法可能抛出的异常。而throw用于抛出一个实际的异常。

Java在执行代码时,只要出现异常,系统就会生成一个异常对象,会依次判断该异常对象是否是catch块后异常类或其子类的实例,如果不是,则会再次判断该异常对象和下一个catch块里的异常类进行比较,如果没有对应的catch块,则程序会在此退出。 捕获异常时,一定要记住先捕获小的异常、子类的异常,再捕获大的。一般异常类之间的继承关系如下:Throwable->Exception->SQLException、IOException、RunTimeException(->IndexOutOfBoundsException、NullPointerException、ClassCastException);Throwable->Error->AWTError、IOError、LinkageError、ThreadDeath;其中Error类的错误一般指虚拟机相关的问题,如系统崩溃、虚拟机出错误、动态链接失败等。这些错误可能无法恢复或无法捕获,将导致应用程序中断。通常应用程序无法处理这些错误,因此应用程序不该试图用catch来捕获Error对象。一般可通过getMessage(异常的详细描述字符串)、printStackTrace(异常的跟踪栈信息输出到标准错误输出)、printStackTrace(PrintStream
s)将异常栈信息输出到指定的输出流、getStackTrace()返回该异常的跟踪栈信息。

Java的垃圾回收机制只会回收堆内存中的对象所占用的内存,不会回收物理资源,所以通常是在finally中回收再try块里打开的数据库连接、网络连接、磁盘文件等物理资源。如果在代码中使用了System.exit(1)退出虚拟机,则finally不会被执行。否则即使return,也会先执行。如果在finally中使用了return或Throw等导致方法终止的语句,则try/catch中的将无用。

使用throws声明抛出异常的思路是:当前方法不知道如何处理这种异常,该异常由上一级调用者处理,如果main也无法处理,也可以使用throws抛给JVM,打印异常栈的跟踪信息,并终止程序运行。throws ExceptionClass1,ExceptionClass2...仅能跟在方法签名的后面使用。如果某段代码抛出了一个Checked异常,则表明该方法调用者要么try...catch显示捕获异常,要么这段代码处在另一个thows声明的方法中,且子类抛出的异常不能比父类更多(即子类的异常类型是父类的子类或者相等级别),Runtime异常被大部分情况下推荐使用,但Checked异常可以提醒程序员需注意或忘记处理的异常错误。

throw每次只能抛出一个异常实例(不是异常类),语法如下:throw ExceptionInstance;throw抛出的Checked异常一定要在try...catch块中,要么在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理。如果抛出的RunTime异常,则没有限制。一般大型的应用系统try和throw同时使用。

自定义异常类:程序可以继承Exception自定义异常类,如果需要抛出运行时的异常则继承RunTimeException基类,同时提供两个构造器,一个是无参数的,一个是带字符串的,用于输出异常对象的详细信息。

异常链:对于正常的用户而言,他们不想看到底层的异常,因为对他们毫无帮助,而且底层的异常抛出,也可能会导致暴漏系统不安全,所以一般通过异常转译,即将当前的异常信息记录下来,方便管理员查看问题原因,同时再throw new 一个自定义异常给上层用户。这种将原始的异常信息保存下来,仅向上提供必要的异常信息处理方式,可以保证底层的信息不会扩散到表现层,可以避免暴露过多的实现细节,完全符合面向对象的封装原则,这种典型的链式处理方式也被称为异常链或者职责链模式。

①Java代码主要包括Checked和RunTime 异常:Checked一般如果在明确知道如何处理该异常时,应该使用try...catch块来捕获异常。如果不知道,则应该在定义该方法时声明抛出该异常。Runtime无需显示的声明抛出,但可以使用try.catch捕获。

②Java从JDK1.4以后可以接受throwable参数的构造器。

③CatchAll写法:try{..}catch(Throwable t) {t.printStackTrace();}//此种写法是一种通过避免错误处理而加快编程进度的机制,在实际编程中尽量避免此种写法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: