在Java中引发异常重构

时间:2020-01-14 01:15:12

标签: 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给出了可能未初始化用户的编译错误,有人可以帮我在这里丢失什么,对我来说似乎很奇怪。

1 个答案:

答案 0 :(得分:1)

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

如果是,user的值是什么?它没有值,所以编译器会抱怨它应有的值。请记住,可以将类SomeHandlerInProject更改为不引发异常,而不必使用getUser()方法重新编译该类,因此编译器可以正确地抱怨它。

即使知道该方法总是会引发异常,您仍然必须按原样编写代码(如果没有),因此您必须为user分配一个值通过对其进行初始化或在catch块中对其进行分配。

如果目标是共享构建异常所需的逻辑,则应使辅助方法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();
    }
}

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