Java:如何使 lint 尊重从内部函数调用抛出的 RuntimeException?

标签 java android-studio lint

我正在使用 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 field x, 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/

相关文章:

Java JDBC - 无效字符,放置打印查询并在 SQLDeveloper 中使用它

java - Activity 布局滞后,直到下一次转换到另一个 Activity 之前

Mac 中的 Android Studio 路径错误

android - 陷入异常错误 :java. util.concurrent.ExecutionException : com. android.ide.common.process.ProcessException :?

在 Android Studio 与 Gradle 中运行时,Android lint 会产生不同的结果

java - 从 HTML 页面提取嵌套部分时出现问题

java - 如果文本之间有 img 标签,则在跨度内分割文本 - selenium - java

java - 安装 SDK 25 时,无法找到哈希字符串 'android-25' 的目标不会消失

configuration - 在 Elixir 中,是否可以修改混合格式以强制最终关键字列表周围的方括号?

android-studio - 迁移到 AndroidX : 后出现 Lint 错误