Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将选中的异常包装为未选中的异常?_Java_Exception_Checked Exceptions - Fatal编程技术网

在Java中将选中的异常包装为未选中的异常?

在Java中将选中的异常包装为未选中的异常?,java,exception,checked-exceptions,Java,Exception,Checked Exceptions,我在java中有一个工厂方法: public static Properties getConfigFactory() throws ClassNotFoundException, IOException { if (config == null) { InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP); config = new Properties(

我在java中有一个工厂方法:

public static Properties getConfigFactory() throws ClassNotFoundException, IOException {
    if (config == null) {
        InputStream in = Class.forName(PACKAGE_NAME).getResourceAsStream(CONFIG_PROP);
        config = new Properties();
        config.load(in);
    }
    return config;
}
我想将这两个已检查的异常转换为未检查的异常。最好的办法是什么

我应该捕获异常并使用捕获的异常作为内部异常抛出新的RuntimeException吗

有没有更好的方法来做到这一点,或者我应该一开始就尝试这样做吗

编辑:
我只是想澄清一下。这些异常将是致命的,因为配置文件基本上与程序的操作有关,所有异常都将被捕获并记录在程序的顶层


我的目的是避免不必要的抛出异常,异常添加到调用我的工厂的每个方法的签名中。

您的操作方法是正确的

为了让已检查的异常在未检查的情况下通过,必须将它们包装在未检查的异常中


请记住,检查异常是有原因的。

只有当客户端无法从任何问题中恢复时,才应使用运行时异常。偶尔做你正在谈论的事情是合适的,但更多的时候是不合适的

如果您使用的是JDK>=1.4,则可以执行以下操作:

try { // Code that might throw an exception } catch (IOException e) { throw new RuntimeException(e); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } 试一试{ //可能引发异常的代码 }捕获(IOE异常){ 抛出新的运行时异常(e); }catch(classnotfounde异常){ 抛出新的运行时异常(e); } 并且rethrown
RuntimeException
将包含原始原因。这样,线程顶端的某个线程捕获了
运行时异常
——您的线程确实捕获了
运行时异常
,所以它们不会只是静静地死去,对吧?--至少可以打印出原因的完整堆栈跟踪

但正如其他人所说,检查异常是有原因的。只有当您确信您的客户无法从您作为未经检查的异常重新引发的问题中恢复时,才能执行此操作

注意:比只使用
RuntimeException
更好的方法是使用更具体的未检查异常(如果有)。例如,如果方法引发
ClassNotFoundException
的唯一原因是缺少配置文件,则可以重新引发
MissingResourceException
,这是一个未经检查的异常,但提供了有关引发它的原因的更多信息。如果它们描述了您正在重试的问题,那么要使用的其他良好的
运行时异常
非法状态异常
类型NotPresentException
不支持运行异常


还要注意,线程捕获RuntimeException并至少记录它总是一个好主意。至少通过这种方式,您可以理解线程消失的原因。

如果您想避免太多的
try-catch
异常,请在工厂本身捕获这两个异常并在那里处理它们。 可能返回一个默认实现

您必须在这里或其他地方处理异常

由于这是一个工厂,我认为最好在工厂中处理这些异常(相同的方法或不同的方法),并返回一个默认实现


无论如何,(业务函数)调用方在遇到
ClassNotFoundException
时将不知道该做什么

关于异常处理最佳实践的两点:

  • 调用方代码无法对异常执行任何操作->将其设置为未检查的异常
  • 调用方代码将根据异常中的信息采取一些有用的恢复操作->使其成为已检查的异常

您可以抛出包含或不包含内部异常的RuntimeException,这取决于调用方可以对其执行什么操作。如果您没有重新引用内部异常,那么您应该将其记录在您的方法中(如果重要)。

首先您这样做的目的是什么?为什么不让方法调用方决定如何处理异常呢?我的工厂背后的想法是避免过多的代码。我不希望每次使用try-catch块时都需要它。您可以编写一个帮助函数来将抛出的异常转换为未检查的异常。本质上,您可以在代码中调用类似于
callUnchecked(()->getConfigFactory())
的东西,并定义
callUnchecked
类似于
try{return supplier.get();}catch(Throwable ex){throw new RuntimeException(ex);}
。通过这种方式,您可以在调用方代码中明确声明调用可能失败并导致崩溃,但不会过多地使用代码。显然,这是Java 8,只是因为lambda。更好的是,扩展了RuntimeException。我更喜欢将我的异常保持为泛型,并尽可能远离自定义异常。远离自定义异常是可以的,这就是为什么我提到了一些作为Java一部分已经存在的最有用的RuntimeException。在调试过程中,一个更具体的异常确实有帮助;m、 原因(e);掷米;啊爪哇。是否有任何不必要的冗长之处?检查过的异常是令人讨厌的。有一些缺点。病毒性调用方代码(只需向抛出中添加新的异常,并准备好进行大规模重构,然后调用方就必须为未检查的异常做好准备,java 8函数api不喜欢检查的异常。@mhstnsc,“病毒性”是一个优势。这类似于更改返回类型。它应该会中断调用方代码。调用方代码符合一个不再存在的约定。@VsevolodGolovanov是的,但此约定因RuntimeExceptions而完全无效。如果不存在RuntimeExceptions,我同意您的意见。RuntimeExceptions是一个修补程序,可以准确更正此vir艾尔的问题