如何在Java中创build自定义exception?
我们如何在Java中创build自定义exception?
要定义一个检查的exception,你需要创build一个java.lang.Exception
的子类(或子类的层次结构)。 例如:
public class FooException extends Exception { public FooException() { super(); } public FooException(String message) { super(message); } public FooException(String message, Throwable cause) { super(message, cause); } public FooException(Throwable cause) { super(cause); } }
可能会抛出或传播此exception的方法必须声明:
public void calculate(int i) throws FooException, IOException;
…调用此方法的代码必须处理或传播此exception(或两者):
try { int i = 5; myObject.calculate(5); } catch(FooException ex) { // Print error and terminate application. ex.printStackTrace(); System.exit(1); } catch(IOException ex) { // Rethrow as FooException. throw new FooException(ex); }
在上面的例子中你会注意到IOException
被捕获并重新IOException
为FooException
。 这是用于封装exception(通常在实现API时)的常用技术。
有时候会出现这样的情况:你不想强制每个方法在throws子句中声明你的exception实现。 在这种情况下,您可以创build一个未经检查的exception。 未经检查的exception是任何延伸java.lang.RuntimeException
exception(本身是java.lang.Exception
的子类):
public class FooRuntimeException extends RuntimeException { ... }
方法可以抛出或传播FooRuntimeException
exception而不声明它; 例如
public void calculate(int i) { if (i < 0) { throw new FooRuntimeException("i < 0: " + i); } }
未经检查的exception通常用于表示程序员错误,例如将一个无效parameter passing给方法或试图违反数组索引边界。
java.lang.Throwable
类是可以在Java中抛出的所有错误和exception的根。 java.lang.Exception
和java.lang.Error
都是Throwable
子类。 任何子类Throwable
可能会被抛出或被捕获。 但是,捕获或抛出Error
通常是不好的做法,因为这是用来表示JVM内部的错误,通常不能由程序员“处理”(例如OutOfMemoryError
)。 同样,您应该避免捕获Throwable
,这可能会导致您捕获除了Exception
之外的Error
s。
public class MyException extends Exception { // special exception code goes here }
把它作为:
throw new MyException ("Something happened")
抓住:
catch (MyException e) { // something }
对于检查的exception:
public class MyCustomException extends Exception { }
从技术上讲,扩展Throwable
任何东西都可以被抛出,但是exception通常是Exception
类的扩展,所以它们是被检查的exception(除了RuntimeException或者基于它的类,它们没有被检查),而不是其他常见的types可抛出的,通常不是被devise成在JVM内部被正常处理的Error
。
您也可以使exception非公开,但是只能在定义它们的包中使用它们,而不是跨包。
至于抛出/捕获自定义exception,它就像内置的exception – 扔通过
throw new MyCustomException()
并通过
catch (MyCustomException e) { }
- exception处理是否需要面向对象的编程?
- 为什么在将客户端JBoss连接回收到远程队列之后仍然抛出SpyJMSExceptionexception?
- 如果线程启动Executor,则无法从Future <?>和SwingWorker获取ArrayIndexOutOfBoundsException
- 读取QueueFile磁带时发生EOFException
- 在支持循环和函数的语言中使用“goto”是否有利? 如果是这样,为什么?
- 使用Joda Date&Time API分析多种格式
- 为什么不把exception用作正常的控制stream?
- 是否有内置的.NETexception,指示非法的对象状态?
- elmah也处理exception