我正在使用Android Studio编写Android代码,并且在编写代码时会执行自动检查棉绒的功能。
我有一个这样的代码片段:
Obj fun() {
Obj o;
if (SOME_CONDITION) {
if (SOME_OTHER_CONDITION) {
o = SOMETHING;
} else {
panic();
}
} else {
panic();
}
return o;
}
其中
panic()
是另一个这样的功能void panic() {
throw new IllegalStateException();
}
但是,棉绒检查器报告可能尚未初始化o的错误。
显然,转到
else
分支时,将抛出IllegalStateException
(RuntimeException
的子类),因此执行已终止。注意
o = SOMETHING;
语句是一个简化的描述。实际的代码更加复杂,并且包含其他条件检查。将
throws RuntimeException
(或IllegalStateException
)添加到panic()
并没有什么区别。我如何才能告诉短绒棉绒,它不会出错(无需捕获异常并再次抛出)?
最佳答案
必须明确分配局部变量
您想要的是不可能的。它不仅是Android Studio中的林特规则,还是由编译器强制执行的语言规则。 JLS 16 states(添加了重点):
对于每次访问局部变量或空白的final
字段x
,必须在访问之前明确分配x
,否则会发生编译时错误。
你可以做什么
重新定义panic()
:
RuntimeException panic() {
return new IllegalStateException();
}
然后像这样使用它,使编译器可以验证控制流从不导致对未分配变量的访问:
...
} else {
throw panic();
}
...
panic()
方法可以执行其他工作,尽管不建议记录日志并随后引发异常,因为这会导致多余的日志记录。关于java - Java:如何使 Lint 尊重从内部函数调用引发的RuntimeException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49522831/