Java回忆录(八)--------异常处理
来源:互联网 发布:电脑滚动字幕软件 编辑:程序博客网 时间:2024/06/06 01:12
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();}//此种写法是一种通过避免错误处理而加快编程进度的机制,在实际编程中尽量避免此种写法。
- Java回忆录(八)--------异常处理
- java之八 异常处理
- 【八】Java的异常处理
- 重拾Java回忆录(八):Java08集合的使用
- 八、java的异常处理机制及自定义异常
- 异常处理机制 --- 相知篇 (八)
- C++基础知识(八)例外、异常处理
- (八)boost库之异常处理
- SpringMVC 异常处理HandlerExceptionResolver 笔记(八)
- Java学习之路0722(八)(object类、异常处理)
- 黑马程序员——Java基础(八)之异常处理、递归、IO流
- Java回忆录(一)-------邂逅
- Java回忆录(四)-------集合
- (Java)异常处理
- Effective Java 读书笔记(八):异常
- 八、WebService处理异常信息
- Python学习(八)------- 控制结构和异常处理
- Python学习笔记(八):Python 异常处理
- Source Insight上添加svn命令,打开当前文件夹命令
- Python之学习笔记(模块的使用)
- Log4net 初识及简单使用
- POJ2001 -- 字典树和字符串的前缀
- SCM知识拓展
- Java回忆录(八)--------异常处理
- Objective-C面向对象(中)
- Merge Sort的java语言实现
- iptables对报文中TTL的操作
- java动态代理和静态代理
- Python之学习笔记(正则表达式)
- solr分页查询和高亮
- poj 1182 食物链 【带权并查集】
- 用回溯法解决0-1背包问题