我正在从
更改代码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给出了可能未初始化用户的编译错误,有人可以帮我在这里丢失什么,对我来说似乎很奇怪。
答案 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保持不变,因为它是调用堆栈快照的构造函数位置。