如何在Java中创建自定义异常?[关闭]


149

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


2
与大多数OO语言中使用的方法相同:扩展基本Exception类。
NDM


1)//表示使用定义的接收类的类MyException扩展了Exception {public MyException(String s){super(s); }} ---------------------------------------------------------------- 2)try {//抛出一个用户定义异常的对象,抛出new MyException(“ TestException”); } catch(MyException ex){System.out.println(“ Caught”); //从MyException对象中打印消息System.out.println(ex.getMessage()); }
Mandeep Yadav

Answers:


285

要定义受检查的异常,请创建的子类(或子类的层次结构)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异常而无需声明。例如

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在s之外捕捉Exceptions。


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

抛出为:

 throw new MyException ("Something happened")

捕捉为:

catch (MyException e)
{
   // something
}

4

对于检查的异常:

public class MyCustomException extends Exception { }

从技术上讲,任何扩展Throwable都可以抛出,但是异常通常是Exception该类的扩展,因此它们是经过检查的异常(RuntimeException或基于它的类除外,这些未经检查的异常)与其他常见的throwable类型相反,Error通常不是为了在JVM内部进行优雅处理而设计的。

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

至于抛出/捕获自定义异常,它的工作方式与内置异常一样-通过

throw new MyCustomException()

并通过捕捉

catch (MyCustomException e) { }

4
RuntimeException扩展了Exception,它不是已检查的异常。
亚当斯基

2
从技术上讲,任何扩展的东西Throwable都可以抛出;例外扩展Exception。Throwable的自定义子类不会被try { ... } catch (Exception e) { ... }块捕获。
Andrzej Doyle

人们为什么赞成这个答案?它包含一些错误。1)您不能实现 throwable,因为它是一个接口。2)任何扩展 Throwable的东西都不例外(Error不是例外,这是错误)。3)这意味着将检查Exception的任何子类,而不会检查RuntimeException。Adamski给出的答案更加准确!
oxbow_lakes

糟糕-我的意思是throwable 当然不是接口!
oxbow_lakes

@oxbow_lakes-理想的解决方案是修复错误,不是吗?无论如何,我自己纠正了它们,因为没有人做过。
琥珀色
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.