【问题标题】:throws Exception refactoring in java在 java 中抛出异常重构
【发布时间】:2020-01-14 01:15:12
【问题描述】:

我正在更改我的代码

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

【问题讨论】:

  • 请发布确切的编译错误。
  • [ERROR] /pathtoClassFile.java:[1239,16] 变量用户可能尚未初始化

标签: java exception error-handling refactoring throws


【解决方案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();
    }
}

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

【讨论】:

  • 你是对的。我想了一会儿,编译器会足够聪明,知道其他类中的方法是否总是抛出异常。但它没有,那是因为它一次只符合一个文件。 :facepalm: 谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-08-10
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2020-12-06
  • 2013-06-24
相关资源
最近更新 更多