Java异常机制主要依赖于try,catch,finally,throws,throw五个关键字
java非正常情况分两种:
异常Exception:
错误Error:一般指与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等,这些错误无法恢复或不可能捕获,导致应用程序中断,通常程序无法处理,不应该用trycatch捕获
java异常分两种:
CheckedException:程序必须处理,必须try/catch或者throws声明
RuntimeException:无须处理,无需try/catch或者throws声明
出现异常,系统会自动生成异常对象,如果程序没有为异常准备捕获,则运行时环境终止,java程序也将退出
try catch花括号不能省略,try块里声明的变量是代码块内部变量,只在try块内有效,外部不能访问,catch也不能
异常捕获时,父类异常catch应该在子类异常后面
java7后一个catch可以捕获多种异常:
捕获多种异常时,多种异常之间使用“|“隔开,
捕获多种异常时,异常变量有隐式的final修饰,因此不能对异常变量重新赋值
catch(IndexOutOfBoundsException|NumberFormatException ie){...}
所有异常对象包含的常用方法:
getMessage():返回该异常的详细描述字符串
printStackTrace():将该异常的跟踪栈信息输出到标准错误输出
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流
getStackTrace():返回该异常的跟踪栈信息
finally用来回收资源,finally中的return和throw语句会导致try/catch中的return和throw失效
System.exit(1)退出虚拟机会让finally得不到执行
异常处理可以嵌套
java7提供可以自动关闭资源的try:
try关键字后紧跟一堆圆括号,括号里可以声明、初始化一个或多个资源,这里的资源是指那些必须在程序结束时显式关闭的资源(数据库连接,网络连接等),try语句在该语句结束时自动关闭这些资源。
这些资源必须实现AutoCloseable或者Closeable接口,即实现close()方法
自动关闭资源的try相当于包含了隐式的finally块(这个finally用于关闭资源),因此这个try语句可以既没有catch块,也没有finally块,如有需要,当然也可以带多个catch块和一个finally块
throws声明一个或多个异常:当前方法不知道如何处理这种过一次类型,交给上一级调用者处理。main方法也可以使用throws声明抛出异常,该异常交给JVM处理,JVM处理方法是:打印异常跟踪栈信息,终止程序运行
throw只能抛出一个异常:
抛出的是异常实例,不是异常类
如果throw抛出的是Checked异常,则该throw语句要么处于try块里,要么放在一个带throws声明的方法中
可以让多个方法协作处理异常
自定义异常类:
用户自定义异常都应该继承Exception类,如果希望自定义Runtime异常,则应该继承RuntimeException。
定义异常类时,同常需要提供两个构造器:一个无参数的构造器,一个是带一个字符串参数的构造器,该字符串作为该异常对象的描述信息,也就是getMessage()的返回值
public class MyException extends Exception{public MyException(){}public MyException(String msg){super(msg);}}
异常跟踪栈:打印出异常一路触发过程,找出源头
异常处理规则:
目标:
使代码混乱最小化
捕获并保留诊断信息
通知合适的人员
采用合适的方式结束异常活动
避免:
不要过度使用异常,简单的就地解决
不要使用庞大的try块
避免使用catch All语句:无法区分异常,重要异常可能被忽略
不要忽略捕获到的异常:尽量处理,不行重新抛出