【问题标题】:How to create custom exceptions in Java? [closed]如何在 Java 中创建自定义异常? [关闭]
【发布时间】:2010-12-17 18:43:34
【问题描述】:

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

【问题讨论】:

  • 这与大多数 OO 语言中使用的方法相同:扩展基 Exception 类。
  • 1) // 表示使用定义的异常的类 class MyException extends Exception { public MyException(String s) { super(s); } } ------------------------------------------------ 2) try { // 抛出用户定义异常的对象 throw new MyException("TestException"); } catch (MyException ex) { System.out.println("Caught"); // 从 MyException 对象打印消息 System.out.println(ex.getMessage()); }

标签: java exception


【解决方案1】:

对于已检查的异常:

public class MyCustomException extends Exception { }

从技术上讲,任何扩展 Throwable 的东西都可以被抛出,但异常通常是 Exception 类的扩展,因此它们是检查异常(除了 RuntimeException 或基于它的类,它们不检查),如与另一种常见的 throwable 类型相反,Errors 通常不是为了优雅地处理超出 JVM 内部而设计的。

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

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

throw new MyCustomException()

并通过

catch (MyCustomException e) { }

【讨论】:

  • RuntimeException 扩展了 Exception 并且不是已检查的异常。
  • 从技术上讲,任何扩展 Throwable 的东西都可以抛出;例外扩展Exception。 Throwable 的自定义子类不会被 try { ... } catch (Exception e) { ... } 块捕获。
  • 为什么人们赞成这个答案?它包含一些不准确之处。 1) 你不能 implmenet 抛出,因为它是一个接口。 2) 扩展 Throwable 的任何内容NOT 都是异常(Error 不是异常,而是错误)。 3) 这意味着检查 Exception 的任何子类,而 RuntimeException 则不检查。 Adamski给出的答案要准确得多!
  • 哎呀——我的意思是 throwable 当然不是接口!
  • @oxbow_lakes - 理想的解决方案是修复不准确之处,不是吗?无论如何,我自己纠正了它们,因为没有其他人这样做。
【解决方案2】:
public class MyException extends Exception {
        // special exception code goes here
}

把它当作:

 throw new MyException ("Something happened")

捕捉为:

catch (MyException e)
{
   // something
}

【讨论】:

    【解决方案3】:

    要定义checked 异常,您需要创建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 子句中声明异常实现的情况。在这种情况下,您可以创建一个 unchecked 异常。未经检查的异常是任何扩展 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,这可能会导致您在捕获Exceptions 的同时捕获Errors。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2012-01-15
      • 2019-02-28
      • 2011-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多