异常
Error:Java 运行时系统的内部错误和资源耗尽错误。
非受检异常(unchecked exception):Error 和 RuntimeException 以及他们的子类。如果出现 RuntimeException 异常基本都是你的错误。常见的如空指针、数组下标越界等。
受检异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。
处理异常
try..catch..finally 或 throws 抛出异常等调用者解决。
finally块
finally 块不管异常是否发生,只要对应的try执行了,则它一定也执行。只有一种方法让finally 块不执行:System.exit()。 finally 通常用来释放资源操作:关闭文件,关闭数据库连接等等。
自定义异常
如果要自定义异常,则扩展 Exception 类即可,因此这样的自定义异常都属于检查异常(checked exception)。如果要自定义非检查异常,则扩展自RuntimeException。
按照国际惯例,自定义的异常应该总是包含如下的构造函数:
- 一个无参构造函数
- 一个带有String参数的构造函数,并传递给父类的构造函数。
- 一个带有String参数和Throwable参数,并都传递给父类构造函数
- 一个带有Throwable 参数的构造函数,并传递给父类的构造函数。
下面是IOException类的完整源代码,可以借鉴。
public class IOException extends Exception
{
static final long serialVersionUID = 7818375828146090155L;
public IOException()
{
super();
}
public IOException(String message)
{
super(message);
}
public IOException(String message, Throwable cause)
{
super(message, cause);
}
public IOException(Throwable cause)
{
super(cause);
}
}
异常注意项
如果子类覆盖了父类的方法,子类抛出的异常可以更具体化(父类异常的孩子)或不抛出异常。如果父类没有抛出异常,那么子类也不能抛出异常。
异常链
在一些大型的,模块化的软件开发中,一旦一个地方发生异常,则如骨牌效应一样,将导致一连串的异常。假设B模块完成自己的逻辑需要调用A模块的方法,如果A模块发生异常,则B也将不能完成而发生异常,但是B在抛出异常时,会将A的异常信息掩盖掉,这将使得异常的根源信息丢失。异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失。
异常链化:以一个异常对象为参数构造新的异常对象。新的异对象将包含先前异常的信息。这项技术主要是异常类的一个带Throwable参数的函数来实现的。这个当做参数的异常,我们叫他根源异常(cause)。
查看Throwable类源码,可以发现里面有一个Throwable字段cause,就是它保存了构造时传递的根源异常参数。这种设计和链表的结点类设计如出一辙,因此形成链也是自然的了。
public class Throwable implements Serializable {
private Throwable cause = this;
public Throwable(String message, Throwable cause) {
fillInStackTrace();
detailMessage = message;
this.cause = cause;
}
public Throwable(Throwable cause) {
fillInStackTrace();
detailMessage = (cause==null ? null : cause.toString());
this.cause = cause;
}
//........
}
finally代码块和finalize()方法有什么区别?
无论是否抛出异常,finally 代码块都会执行,它主要是用来释放应用占用的资源。finalize() 方法是 Object 类的一个 protected 方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。
常见的Exception和Error
Exception:
NullPointerException
ArrayIndexOutOfBoundsException
ClassCastException
ArithmeticException: / by zero
NumberFormatException
CloneNotSupportedException
FileNotFoundException
ClassNotFoundException
NoSuchMethodException
Error:
OutOfMemoryError
IOError
VirtualMachineError
ThreadDeath
AssertionError
参考