如何在Java中创建自定义异常?

Sur*_*nti 147 java exception

我们如何在Java中创建自定义异常?

Ada*_*ski 281

要定义已检查的异常,请创建子类(或子类的层次结构)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); }
}
Run Code Online (Sandbox Code Playgroud)

可能抛出或传播此异常的方法必须声明:

public void calculate(int i) throws FooException, IOException;
Run Code Online (Sandbox Code Playgroud)

...并且调用此方法的代码必须处理或传播此异常(或两者):

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);
}
Run Code Online (Sandbox Code Playgroud)

您将在上面的示例中注意到IOException被捕获并重新抛出为FooException.这是用于封装异常的常用技术(通常在实现API时).

有时会出现这样的情况:您不希望强制每个方法在其throws子句中声明您的异常实现.在这种情况下,您可以创建未经检查的异常.未经检查的异常是任何扩展的异常java.lang.RuntimeException(它本身是其子类java.lang.Exception):

public class FooRuntimeException extends RuntimeException {
  ...
}
Run Code Online (Sandbox Code Playgroud)

方法可以在FooRuntimeException不声明的情况下抛出或传播异常; 例如

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}
Run Code Online (Sandbox Code Playgroud)

未经检查的异常通常用于表示程序员错误,例如将无效参数传递给方法或尝试破坏数组索引边界.

java.lang.Throwable班是所有的错误和异常,可以在Java中抛出的根源. java.lang.Exception并且java.lang.Error都是Throwable.的子类.任何子类都Throwable可能被抛出或被捕获.但是,捕获或抛出通常是不好的做法,Error因为这用于表示JVM内部通常无法由程序员"处理"的错误(例如OutOfMemoryError).同样你应该避免捕捉Throwable,这可能会导致你Error除了Exceptions 之外还能捕捉到它.


lau*_*ura 25

public class MyException extends Exception {
        // special exception code goes here
}
Run Code Online (Sandbox Code Playgroud)

把它扔成:

 throw new MyException ("Something happened")
Run Code Online (Sandbox Code Playgroud)

赶上:

catch (MyException e)
{
   // something
}
Run Code Online (Sandbox Code Playgroud)