异常

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。

按照国际惯例,自定义的异常应该总是包含如下的构造函数:

  1. 一个无参构造函数
  2. 一个带有String参数的构造函数,并传递给父类的构造函数。
  3. 一个带有String参数和Throwable参数,并都传递给父类构造函数
  4. 一个带有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

参考

http://www.importnew.com/26613.html

posted @ 2018-07-26 19:36  罗贱人  阅读(153)  评论(0编辑  收藏  举报