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

时间:2009-11-18 07:59:38

标签: java exception

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

3 个答案:

答案 0 :(得分:279)

要定义已检查异常,请创建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); }
}

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

public void calculate(int i) throws FooException, IOException;

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

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已被捕获并重新引发为FooException。这是用于封装异常的常用技术(通常在实现API时)。

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

public class FooRuntimeException extends RuntimeException {
  ...
}

方法可以在不声明的情况下抛出或传播FooRuntimeException异常; e.g。

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

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

java.lang.Throwable类是可以在Java中抛出的所有错误和异常的根。 java.lang.Exceptionjava.lang.Error都是Throwable的子类。子类Throwable的任何内容都可能被抛出或被捕获。但是,捕获或抛出Error通常是不好的做法,因为这用于表示JVM内部通常无法由程序员“处理”的错误(例如OutOfMemoryError)。同样,您应该避免捕获Throwable,除了Error之外,这可能会导致您抓住Exception

答案 1 :(得分:25)

public class MyException extends Exception {
        // special exception code goes here
}

将其扔为:

 throw new MyException ("Something happened")

赶上:

catch (MyException e)
{
   // something
}

答案 2 :(得分:4)

对于已检查的例外:

public class MyCustomException extends Exception { }

从技术上讲,任何扩展Throwable的东西都可以被抛出,但异常通常是Exception类的扩展,以便它们被检查异常(除了RuntimeException或基于它的类,它们不是检查),而不是其他常见类型的throwable Error,它们通常不是为了在JVM内部之外进行优雅处理而设计的。

您也可以将异常设为非公开,但是您只能在定义它们的包中使用它们,而不是跨包。

就抛出/捕获自定义异常而言,它就像内置的异常一样 - 通过

抛出
throw new MyCustomException()

并通过

捕获
catch (MyCustomException e) { }