我们知道,如果系统抛出了异常,程序就会终止运行,有时候,这种情况很让人恼火,比如我们启动了一个任务线程,你一直以为它在正常的运行,但当你第 二天一大早查看的时候发现它实际上因为抛出了一个异常早就停止了运行,这个原本你以为一个晚上就可以完成的任务就没有完成了,所以我们有时为了不让系统因 为抛出异常而终止运行,我们就采用try…catch块来捕获异常,从而使得程序在出现了异常的时候仍能继续运行下去。
但有时候,当我们系统运行缺少某些必要的条件时,我们却一定要使得程序就此打住不要再运行下去了,那么这个时候try…catch块就不合适了,因此可以考虑编写自定义的异常类来完成这样的工作。
Exception类是java中所有异常类的父类,比如我们经常见到的NullPointerException所继承的父类RuntimeException就是继承于Exception,Exception类有四个构造方法,子异常类在继承Exception类后,可以自由选择调用其中的哪个构造方法,四个构造方法分别如:
构造方法摘要 | |
Exception() 构造详细消息为 null 的新异常。 | |
Exception(String message) 构造带指定详细消息的新异常。 | |
Exception(String message, Throwable cause) 构造带指定详细消息和原因的新异常。 | |
Exception(Throwable cause) 根据指定的原因和 (cause==null ? null : cause.toString()) 的详细消息构造新异常(它通常包含 cause 的类和详细消息)。 |
现在我们自定义一个异常类:MyException,代码如下:
public class MyException extends Exception { private static final long serialVersionUID = 1L; /** * 带自定义错误信息的输出 * @param message */ public MyException(String message){ super(message); } /** * 自定义错误信息和异常抛出 * @param message * @param cause */ public MyException(String message,Throwable cause){ super(message,cause); } /** * 只有异常抛出 * @param cause */ public MyException(Throwable cause){ super(cause); } }
从上可看出,代码非常简单,我们调用了父类三个构造方法,下面来做一个简单的抛出异常例子:
public static void main(String[] args) throws MyException { try{ String s = null; s.trim(); }catch(NullPointerException e){ throw new MyException("s is null",e); } }
抛出异常如下:
Exception in thread "main" MyException: s is null at Test.main(Test.java:717) Caused by: java.lang.NullPointerException at Test.main(Test.java:715)
跟java的系统异常类的使用也是一样的,就是如此简单。