我正在更改我的代码
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/