java使用一种被称为“异常处理” (Exception Handling)的面向对象的错误捕获机制处理程序运行
时出现的错误。当方法在运行过程中出现异常时会抛出异常对象。
所有异常都继承自Throwable类,又分为error和exception两类。
Error类描述了 Java 运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。而Exception类又分为RuntimeException和其他类型的Exception。
任何 RuntimeException类的子类以及 Error 的子类称为未检查异常(Unchecked Exception)。如果出现 RuntimeException 类型异常,应该检查程序,而不应该把异常抛给其他调用者。Unchecked Exception包括数组访问越界异常、访问空指针异常等。
其他的异常被称为已检查异常(Checked Exception)。如果方法中可能抛出已检查异常,则该方法应该捕获异常或在其方法头中声明它可能会抛出的已检查异常,即把异常抛给下一个调用者。Checked Exception包括试图打开一个不存在的文件或错误格式的 URL等。
如果一个 Java 方法可能碰到自己无法处理的情况,就应该声明该方法将抛出一个异常。
声明异常:
public g FileInputStream(String name)
throws FileNotFoundException{}
方法必须声明它可能抛出的全部Checked Exception或者在方法内部捕获Checked Exception。
使用throw语句抛出异常对象:
String readData(Scanner in) throws EOFException
{
...
while (...) {
if (!in.hasNext ()) {
if (n < len) )
throw w new EOFException ();
}
...
}
return s;
}
一个方法只能抛出在方法声明中声明的异常以及Error 、RuntimeException 和它们的子类类型的
异常。一旦方法抛出异常,该方法就不可能返回到调用者处。
捕获异常:
当调用一个显式声明异常的方法时,应该使用try- catch 语句捕获异常,尽量避免把异常抛出。当 try 语句块中的代码产生异常,程序跳过 try块中的其他语句,而转去执行 catch 块中的代码。try 语句块中的代码可能产生多种类型的异常,可以用多个 catch 语句块分别捕获并处理。如果这些异常存在继承关系,则 catch 子句应该按照一定的顺序捕获。
try {
// 可能产生异常的代码
}
catch (Exception e1) {
// 可以捕获任何 Exception 及其子类的实例
}
catch (IOException e2) {
// 没有机会执行
}
catch (FileNotFoundException e3) {
// 没有机会执行
}
当 try 语句块中的代码产生异常时,可以在相应的catch 语句中进行处理,处理后还可以把该异常抛出给其他调用者。
try
{
access the database
}
catch (SQLException e)
{
Throwable se = new ServletException("database error");
se.setCause(e);
throw se;
}
有时,不论异常是否出现或是否被捕获,都希望执行某些代码,可以通过 finally 语句。
try {
statements;
}
catch (Exception e) {
handling e;
}
finally {
finalStatements;
}
异常对象相关方法:
public String getMessage () 返回异常对象的详细信息
public String toString () 返回异常对象的简要描述
public String getLocalizedMessage () 返回异常对象的本地化信息
public void printStackTrace () 在控制台上打印异常对象和它的追踪信息
使用异常机制的建议:
1. 异常处理不能代替简单的测试
2. 不要过分地细化异常
3. 利用异常层次结构
4. 不要压制异常,在检测错误时,“苛刻” 要比放任更好
5. 不要羞于传递异常