为什么ClassNotFoundException会出现这种行为?

时间:2014-10-20 16:36:29

标签: java exception-handling error-handling compiler-errors compiler-warnings

我正在开发一个库,在某些方法中我想抛出一个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 类需要直接处理它们。

4 个答案:

答案 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)

由于ClassNotFoundExceptionthrows 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