我正在使用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分支时,将抛出IllegalStateExceptionRuntimeException的子类),因此执行已终止。

注意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/

10-10 09:23