如何在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被捕获并重新IOExceptionFooException 。 这是用于封装exception(通常在实现API时)的常用技术。

有时候会出现这样的情况:你不想强制每个方法在throws子句中声明你的exception实现。 在这种情况下,您可以创build一个未经检查的exception。 未经检查的exception是任何延伸java.lang.RuntimeExceptionexception(本身是java.lang.Exception的子类):

 public class FooRuntimeException extends RuntimeException { ... } 

方法可以抛出或传播FooRuntimeExceptionexception而不声明它; 例如

 public void calculate(int i) { if (i < 0) { throw new FooRuntimeException("i < 0: " + i); } } 

未经检查的exception通常用于表示程序员错误,例如将一个无效parameter passing给方法或试图违反数组索引边界。

java.lang.Throwable类是可以在Java中抛出的所有错误和exception的根。 java.lang.Exceptionjava.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) { }