我正在开发一个库,在某些方法中我想抛出一个ClassNotFoundException,但eclipse强迫我“添加一个抛出声明”或“使用try / catch环绕”。我不想实现它们中的任何一个,我想要的是将这个例外抛给类的客户端。我已经看到所有扩展ReflectiveOperationException的类都迫使我添加或包围异常。另一方面,我已经看到扩展RuntimeException的类不需要添加或包围异常。
作为我的问题的抽象,想象一下像这样的代码:
public Class getClassForCellType(int cellTypeRequested) {
Class cellClassRequired = null;
if (cellTypeRequested == 0) {
cellClassRequired = CellA.class;
} else if (cellTypeRequested == 1) {
cellClassRequired = CellB.class;
} else {
throw new ClassNotFoundException("cellType Not Available");
}
return cellClassRequired;
}
我想抛出ClassNotFoundException,因为正在发生的事情,我不想使用另一个更通用的类。有人可以解释一下为什么那些 ReflectiveOperationException 类需要直接处理它们。
答案 0 :(得分:2)
Eclipse告诉你(正如任何Java编译器必须做的那样),如果你希望ClassNotFoundException
能够转义你的方法,那么该方法必须声明这是可能的,像这样:
public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException {
// ...
throw new ClassNotFoundException("cellType Not Available");
// ...
return cellClassRequired;
}
这是除Exception
及其子类之外的任何java.lang.RuntimeException
的规则。
答案 1 :(得分:2)
我认为您的问题出现是因为您没有将ClassNotFoundException用于其预期目的。当在类路径上没有请求的Java类的实现时,非常特别地要抛出此异常。
在这里,您尝试将参数转换为类,但这与缺少的类定义的系统级错误不同。
我会创建你自己的CellTypeClassNotResolvedException,它会扩展RuntimeException并抛出它:
public CellTypeClassNotResolvedException extends RuntimeException {
public CellTypeClassNotResolvedException(String s) {
super(s);
}
}
答案 2 :(得分:0)
由于ClassNotFoundException
为throws
declaration,您需要添加checked exception。要修复代码,它看起来像这样:
public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException {
Class cellClassRequired = null;
if (cellTypeRequested == 0) {
cellClassRequired = CellA.class;
} else if (cellTypeRequested == 1) {
cellClassRequired = CellB.class;
} else {
throw new ClassNotFoundException("cellType Not Available");
}
return cellClassRequired;
}
答案 3 :(得分:0)
在Java中,我们有两种核心类型的异常: 已检查和未经检查的例外情况。
检查异常:如果抛出此类异常,则必须由方法的客户端或方法本身显式处理。 ReflectiveOperationException就是一个例子。这些类型的异常通常用于反映API问题,使用问题,合法/业务应用程序故障。
Java实现此要求的方法是说您要么必须在方法中处理(即捕获异常),要么必须明确告知客户端它们可能会获得此异常(即throws子句)
未经检查的异常:如果抛出此类异常,则不必显式处理。这些通常反映了编程错误 - 例如,ArrayIndexOutOfBoundsExceptions就是一个很好的例子 - 你不会预料到会遇到这个问题,如果你这样做了,你就可以相对确信它是一个错误并且不会出现问题。期望客户在他们的代码中满足它!
在您的示例中,您试图通过抛出ClassNotFoundException告诉客户端他们传递了一个错误的参数。他们需要知道为了处理代码中的场景而抛出这个,因此你需要将throws声明添加到方法签名中。
public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException {
}
有关更多异常教程,请参阅Oracle文档:http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html