我正在使用 Android Studio 编写 Android 代码,它在编写代码时执行自动 lint 检查。
我有一个这样的代码片段:
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();
}
但是,lint 检查器会报告 o 可能尚未初始化的错误。
显然,当转到else
分支时,会抛出IllegalStateException
(RuntimeException
的子类),因此执行已终止。
请注意,o = SOMETHING;
语句是一个简化的描述。实际的代码更复杂,并且包含其他条件检查。
将 throws RuntimeException
(或 IllegalStateException
)添加到 panic()
不会产生任何区别。
如何告诉 linter 它不会出错(无需捕获异常并再次抛出)?
最佳答案
局部变量必须明确赋值
你想要的东西是不可能的。它不仅仅是 Android studio 中的 linter 规则,它是编译器强制执行的语言规则。 JLS 16 states (强调):
For every access of a local variable or blank
final
fieldx
,x
must be definitely assigned before the access, or a compile-time error occurs.
你可以做什么
重新定义panic()
:
RuntimeException panic() {
return new IllegalStateException();
}
然后像这样使用它来允许编译器验证控制流永远不会导致访问未分配的变量:
...
} else {
throw panic();
}
...
panic()
方法可以执行额外的工作,但不鼓励记录日志然后抛出异常,因为它往往会导致冗余日志记录。
关于Java:如何使 lint 尊重从内部函数调用抛出的 RuntimeException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49522831/