要定义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.Exception 和 java.lang.Error 都是 Throwable 的子类。任何子类Throwable 的东西都可能被抛出或捕获。但是,捕获或抛出 Error 通常是不好的做法,因为它用于表示 JVM 内部的错误,通常不能由程序员“处理”(例如 OutOfMemoryError)。同样,您应该避免捕获Throwable,这可能会导致您在捕获Exceptions 的同时捕获Errors。