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

如何在Java中创建自定义异常?,java,exception,Java,Exception,如何在Java中创建自定义异常?对于选中的异常: public class MyCustomException extends Exception { } 从技术上讲,任何扩展Throwable的东西都可以被抛出,但是异常通常是Exception类的扩展,因此它们是被检查的异常(除了RuntimeException或基于它的类,它们没有被检查),而不是其他常见类型的Throwable,错误s通常不是为在JVM内部之外优雅地处理而设计的 您也可以将异常设置为非公共的,但是您只能在定义它们的包中使

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

对于选中的异常:

public class MyCustomException extends Exception { }

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

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

就抛出/捕获自定义异常而言,它的工作原理与内置异常一样-通过抛出

throw new MyCustomException()
并通过

catch (MyCustomException e) { }
把它当作:

 throw new MyException ("Something happened")
捕获为:

catch (MyException e)
{
   // something
}

要定义选中的异常,您需要创建的子类(或子类的层次结构)。例如:

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;
。。。调用此方法的代码必须处理或传播此异常(或两者兼有):

在上面的示例中,您会注意到它被捕获并作为
footexception
重新调用。这是用于封装异常的常用技术(通常在实现API时)

有时,在某些情况下,您不希望强制每个方法在其throws子句中声明您的异常实现。在这种情况下,您可以创建一个未选中的异常。未经检查的异常是任何扩展的异常(其本身是的子类):

方法可以抛出或传播
foorRuntimeException
异常,而无需声明它;e、 g

public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}
public void计算(inti){
if(i<0){
抛出新的FooRuntimeException(“i<0:+i”);
}
}
未经检查的异常通常用于表示程序员错误,例如将无效参数传递给方法或试图突破数组索引界限


该类是Java中可以抛出的所有错误和异常的根。和都是的子类。任何子类都可能被抛出或捕获。然而,捕获或抛出通常是不好的做法,因为这是用来表示JVM内部的错误,程序员通常无法“处理”这些错误(例如)。同样,您应该避免捕获,这可能会导致您捕获s之外的s。

这与大多数OO语言中使用的方法相同:扩展基本异常类。请检查1)//表示使用定义的异常类MyException Extended Exception{public MyException(String s){super(s);}-----------------------------------------------------2)尝试{//抛出用户定义异常的对象抛出新的MyException(“TestException”);}catch(MyException ex){System.out.println(“catch”);//打印MyException对象System.out.println(例如getMessage());}RuntimeException扩展了异常,并且不是一个选中的异常。从技术上讲,任何扩展
Throwable
的内容都可以抛出;异常扩展
异常
。Throwable的自定义子类不会被
try{…}catch(异常e{…}
块捕获。为什么人们会投票支持这个答案?它有一些不准确之处。1) 您不能将implmenet throwable作为接口。2) 任何扩展Throwable的内容都不是异常(
Error
不是异常,而是错误)。3) 它意味着检查Exception的任何子类,而不检查RuntimeException。亚当斯基给出的答案更准确!哦,我的意思是throwable当然不是一个界面@oxbow_湖-理想的解决方案是修正误差,不是吗?不管怎么说,我自己已经改正了,因为没有人这样做。
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);
}
public class FooRuntimeException extends RuntimeException {
  ...
}
public void calculate(int i) {
  if (i < 0) {
    throw new FooRuntimeException("i < 0: " + i);
  }
}