0

我正在开发一个库,并且在一些方法中,我想抛出一个ClassNotFoundException但是eclipse迫使我'添加抛出声明'或'使用try/catch环绕'。我不想实现他们中的任何一个,我想要的是把这个excepcion扔给班上的客户。我已经看到所有扩展了ReflectiveOperationException的类迫使我添加或包围异常。另一方面,我已经看到,扩展RuntimeException的类不需要添加或包围异常。为什么ClassNotFoundException会出现这种行为?

由于我的问题的抽象,想象一个像这样的代码:

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的,因为是发生什么事,我不喜欢用另一种更通用类。有人可以请解释为什么这些类需要直接处理它们。

+7

【JAVA:检查VS未经检查的异常说明](http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception -explanation) – 2014-10-20 16:37:31

+1

你有没有听说过“检查异常”这个词?这是Java语言的一个臭名昭着的方面。 – 2014-10-20 16:37:46

+0

添加一个'throws'声明并不是真正“实现”任何东西;这对客户来说更像是一种信号,他们称这种方法可能抛出这个异常,并且他们或者需要捕获它或者声明他们也抛出它。这可能是你想要做的。 – ajb 2014-10-20 16:43:31

回答

2

我想是因为你不使用的ClassNotFoundException它的预期目的的问题出现了。当在类路径中没有提供所请求的Java类的实现时,会非常明确地抛出此异常。

这里您试图将参数转换为类,但这与缺少类定义的系统级错误不同。

我想创建自己的CellTypeClassNotResolvedException延伸的RuntimeException和扔东西,而不是:

public CellTypeClassNotResolvedException extends RuntimeException { 
    public CellTypeClassNotResolvedException(String s) { 
     super(s); 
    } 
} 
+0

你是对的。感谢你的回答! :) – Androider 2014-10-20 16:54:18

2

Eclipse是告诉你(作为任何Java编译器必须做的),如果你想有一个ClassNotFoundException能够逃脱你的方法,该方法必须声明这是可能的,就像这样:

public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException { 
    // ... 
     throw new ClassNotFoundException("cellType Not Available"); 
    // ... 
    return cellClassRequired; 
} 

这是除java.lang.RuntimeException及其子类之外的任何Exception的规则。

+0

我认为错误是Throwable的子类,为此你的最后一个陈述不会成立。 RunThread不是Throwable,而是Exception I class beleive,RuntimeException是规则的例外。 +1,因为它回答了问题。 – Jimmy 2014-10-20 16:55:20

+0

很对,@Jimmy。我输入得太快了。现在纠正了。 – 2014-10-20 17:03:26

0

由于ClassNotFoundExceptionchecked exception,您需要添加throws declaration。修复您的代码,它应该是这样的:

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; 
} 
+0

这正是我想避免:) – Androider 2014-10-20 16:55:13

0

在Java中,我们有两个核心类型的异常: 检查,检查异常。

检查异常:如果抛出此类异常,它必须由方法的客户端或方法本身明确处理。 ReflectiveOperationException是一个例子。这些类型的异常通常用于反映API问题,使用问题,合法/业务应用程序故障。如果你需要在你的方法中处理(即捕获异常),或者你必须明确地通知客户他们可能会得到这个异常(即throws子句),那么Java就可以满足这个要求。

未经检查的异常:如果抛出此类异常,则不必显式处理。这些通常反映了编程错误 - 例如,ArrayIndexOutOfBoundsExceptions就是一个很好的例子 - 你不会预料到遇到这个问题,如果你这样做了,你可以相对确信它是一个错误,并且不希望客户端满足它在他们的代码中!


在您的示例中,您试图告诉客户端他们通过抛出ClassNotFoundException传递给您一个错误的参数。他们需要知道这可能是为了处理代码中的场景而引发的,因此您需要将throws声明添加到方法签名中。

public Class getClassForCellType(int cellTypeRequested) throws ClassNotFoundException { 

} 

见的Oracle文档上多个异常教程:http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html