java - java中抛出异常重构

标签 java exception error-handling refactoring throws

我正在更改我的代码

Implementation 1 : 
public User getUser(String userid) {
    User user;
    try {
        // some code to get User

    }catch(InterruptedException e) {
        throw new CustomException();
    }

    return user;
}

Implementation 2 : 
public User getUser(String userid) {
    User user;

    try {
        // some code to get User

    }catch(InterruptedException e) {
        SomeHandlerInProject.throwCustomErr();
    }

    return user;
}


class SomeHandlerInProject {
    public static void throwCustomErr() {
        throw new CustomException();
    }
}

实现 2 给出编译错误,用户可能未初始化,有人可以帮助我在这里缺少什么,对我来说似乎很奇怪。

最佳答案

编译器不知道SomeHandlerInProject.throwCustomErr()总是会抛出异常,因此就编译器代码分析而言,该方法可能会正常返回。

如果是的话, user 的值是多少?是?它不会有值,因此编译器会提示这一点,这是理所应当的。记住,类(class)SomeHandlerInProject可以更改为不抛出异常,而无需使用 getUser() 重新编译该类方法,因此编译器提示它是正确的。

即使知道该方法总是抛出异常,您仍然必须编写代码,就好像它不会抛出异常一样,因此您必须为 user 分配一个值。 ,或者通过初始化它,或者通过在 catch 中分配给它 block 。

如果目标是共享构建异常所需的逻辑,则应该使用辅助方法 return异常,不抛出它,并让调用者执行 throw 。这样编译器就不会提示:

public User getUser(String userid) {
    User user;
    try {
        // some code to get User
    } catch (InterruptedException e) {
        throw SomeHandlerInProject.buildCustomErr();
    }
    return user;
}

class SomeHandlerInProject {
    public static CustomException buildCustomErr() {
        return new CustomException();
    }
}

堆栈跟踪保持不变,因为它是为调用堆栈进行快照的构造函数位置。

关于java - java中抛出异常重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59726328/

相关文章:

java - 尝试列出对象时,AmazonS3 客户端 org.xml.sax.SAXParseException

c# - 如果在 C# 中的 Catch block 中发生异常,会发生什么情况。在这种情况下调用者的结果也是什么

python - 语法错误 : EOL while scanning string literal while using backslash escape

java - @Query 注释和带引号的字符串中的命名参数

java - 在 Java EE Web 应用程序中使用 JPL (Java + Prolog)

java - 创建我自己的 Java 异常子类

java - 如何使用采用 String 参数的自定义异常来扩展 Java Exception 类?

android - 预览未在Android Studio 3.1.4中显示

python - 如何从列表中删除错误的URL?

java - 如何编辑jar内的代码?