A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 李云贵 中级黑马   /  2014-7-21 09:15  /  705 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

异常
java中的异常实际是一个对象,描述了代码中出现的异常情况。
代码运行时,在有异常的方法中中创建并抛出一个异常对象,然后在相应的异常处理模块中处理。
String str=null;
str.length;//抛出NullPointerException。详细描述异常类型和异常代码位置。
异常类的分类
Throwable:Error      定义了java运行时的内部错误。指明与运行环境相关的错误。不应抛出,发生是通常无法处理,程序员不用处理。
            Exception   定义了程序中应该捕获的异常。下有分支 RuntimeExceptionIOException等
                          RuntimeException  编程人员的逻辑错误,可以不用处理。
                                            未检查异常(unchecked exception)
                          非RuntimeException 外部偶然因素引起,必须处理。
                                       检查异常(checked exception),必须用throws声明(才可用throw再次抛出),必须有try-catch语句块捕获异常

        Exception类的常见子类如图2所示。


异常的使用
异常捕获(try-catch)
try{
//可能出现异常代码
}
catch(异常对象类型1 异常对象)
{
//处理代码
}
catch(异常对象类型2 异常对象)
{
//处理代码
}

在捕获异常的时候要注意,可以有多个catch,捕获父类异常的catch语句必须放在后面。
比如catch(Exception e)放在第一行,那么其分支下的子类异常都会被他捕获,它后面的catch语句永远都不会得到执行。
printStackTrace()输出异常的堆栈信息
该方法定义于Throwable类中。
finally语句块
在try-catch中只能有一个finally语句块,定义必须执行代码(不管是否发生异常)。
因为在异常代码发生行之后的代码得不到执行(异常出发后跳到catch中了),但是有些语句不管发生异常必须执行,比如连接数据库后必须释放连接,这就需要finally语句块了。
抛出异常
有一种说法,最好的异常处理是什么都不做。意思是定义要抛出的异常,把异常处理工作留给方法的调用者。
通过throws抛出异常(隐式)
在定义方法的时候,直接在方法名后面定义可能抛出的异常。
方法名() throws 异常类型1,异常类型2,异常类型n {
}
通过throw再次抛出异常(显式)
再次抛出异常,是捕获到异常,不处理,直接抛出,留给方法调用者处理。
检查异常(必须用throws声明后才可用throw再次抛出。方法throws了检查异常,必须有try-catch语句块捕获异常


定义自己的异常
定义自己的异常类
实现自己的异常类需要继承Exception类并实现它的一些方法即可。
查看java的API发现,Exception类并没有定义任何方法。单纯的继承了Throwable类的方法。
Throwable类的主要方法有
public Throwable fillInStackTrace() 返回一个完全堆栈追踪的Throwable对象,此对象可被再次抛出
public Throwable getCause() 返回此throwable对象的cause,若cause未知或不存在,返回null
public String getMessage() 返回此throwable对象的详细消息字符串
public String toString() 返回一个包含异常描述的String对象
public StackTraceElement[] getStackTrace() 返回一个异常堆栈追踪的数组,[0]栈顶表示最后的方法调用,通常是创建和抛出该throwable的地方。[最后一个]表示第一个方法调用。
public void printStackTrace() 将异常堆栈追踪输出到标准错误流。
public void printStackTrace()调用是可以使用参数PrintStream或者PrintWriter,从而指定输出流。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马