当前位置: 首页 > 知识库问答 >
问题:

枚举内部的变量初始化,或阻止枚举在编译时丢失事例

翁钧
2023-03-14

我对在枚举开关中初始化的变量有问题。似乎Android Studio(和Eclipse)忽略了我在所有情况下都在初始化变量的事实,并声明:“变量'x'可能没有被初始化”。我不想放默认情况。

代码示例:

public enum  eTest {
    One,
    Two
}


public class Test {
    public void method(eTest value) {
        String toPrint;

        switch (value) {
            case One:
                toPrint = "One";
                break;
            case Two:
                toPrint = "Two";
                break;
        }

        System.out.println(toPrint); // <-- said error
    }
}

我不想初始化变量,但我不确定有没有办法在不初始化的情况下做到这一点(我很想知道我错了)。假设这是不可能的,我想确保必须将新的枚举值添加到此开关中。

第一次尝试:
我尝试将“漏案的枚举'切换'语句”添加到Android Studio设置中,但这有两个问题:

  1. 它不会失败构建(仅显示带有红色标记的地方)。
  2. 这取决于本地配置,我希望可以对所有用户强制执行。

第二次尝试:<br>我发现在构建中使用lintpoptions应该是可行的。gradle文件(如前所述,我使用的是Android Studio),但我无法使其按预期工作。我在build.gradle中添加了以下选项:

lintOptions {
    enable 'EnumSwitchStatementWhichMissesCases'
    abortOnError true
}

我假设这也不起作用,因为有两个可能的问题:

  1. 名称是错误的(我从Android Studio使用设置时创建的xml中获取它)。
  2. 此问题的默认严重性是警告而不是错误,但是我找不到如何更改问题的严重性。

第三次尝试:
应该可以向Android Studio项目添加lint.xml,我也尝试了这个,但它没有失败构建,所以我假设我在那里做错了什么。我将以下内容放在AndroidManifest位置:

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="EnumSwitchStatementWhichMissesCases" severity="error" />
</lint>

此外:
我已经看到了这个答案,但这不是我想要的,由于这是关于一个特定的构建过程,我希望有一个更好的解决方案。

问题:
是否有可能:

<罢工> 1.解决原问题。 编辑:这不能做(感谢黑带-见下面的评论)
<罢工> 如果没有:
2.将上述选项添加到构建过程中(欢迎任何可以在其他用户上强制执行的选项)。

编辑:澄清 - 我想知道如何在编译时使用Lint来防止在编译时缺少案例的枚举

共有2个答案

司空高义
2023-03-14

创建默认案例。

enum myEnum(one, two, error)
String toPrint;

switch (myEnum)
{
case(one):
toPrint = "one";
break;

case (two):
toPrint = "two";
break;

default:
toPrint = "error";
}
尉迟韬
2023-03-14

这个错误来自Java编译器,而不是IntelliJ IDEA检查或Android linter。如果用命令行Java编译器编译一个普通的Java类(非Android ),您会看到完全相同的错误。正因为如此,你试图修复它的努力都失败了。< code > enumswitchstatementwithmissescases 检查检测在这种情况下不会出现的不同类型的问题。

Java编译器将此报告为错误的原因是因为Java支持单独编译类。即使现在您的开关覆盖了枚举的所有可能情况,也有可能在稍后重新编译枚举类,并包含其他条目,而您的开关不会处理这些条目。

因此,即使将未知枚举条目传递给方法,您也需要确保变量已初始化。您可以通过向变量声明添加初始化程序或向交换机添加default分支来做到这一点(分支中的代码可以简单地抛出错误)。

 类似资料:
  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 问题内容: 我有几个需要国际化的枚举(我需要将枚举值转换为某些语言才能在jsf页面中显示)。考试列举: 翻译将是例如/ 转换应存储在MessageBundle(属性文件)中。我正在寻找一个简单,通用的解决方案(最好是无需在所有枚举中编写额外的代码),而该解决方案在jsf方面并不需要太多。仅提及它,当然,两个不同的枚举可能具有相同的枚举值(例如,类似的值在不同的枚举中具有不同的含义)。 我想出的解决

  • 问题内容: 通过阅读SCJP书籍,我在第1章“自测”中发现了类似的内容: 注意:代码编译正常。我不明白的是为什么我们可以从变量访问DOG,CAT或FISH常量。我认为(并且也写在书中)DOG,FISH,CAT是常量,其实现方式类似于。 所以,如果它们确实是静态的,为什么我们可以从中访问它们呢?最后一行是我熟悉的方式。 问题答案: 写作 和写作一样。也就是说,编译器将用其编译时类型Animal替换变

  • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种:

  • 问题内容: 如果必须在使用该对象之前对其进行初始化,那么初始化基于Java枚举的单例的正确方法是什么。 我已经开始编写代码,但是不确定是否做对了。您能帮我实现这个单例吗? 问题答案: 完全有可能为以下对象创建构造函数: 注意: 字段可以是最终的(我们喜欢) 不必是 构造函数会自动为您调用 注意最后一点。由于-singletons是在加载类时急切创建的,因此您无法将任何参数传递给构造函数。当然可以通

  • 我正在设计一款纯文字的电子游戏,游戏中的两个角色不常出现在一起,但在内心和性格上非常相似。 我的问题是,我不知道如何通过使用静态最终内部常量的构造函数初始化常量。否则这场比赛就可以开始了 这是一个两难的问题: 如果我没弄错的话,枚举常量必须在枚举的第一行定义 我如何解决这个第22条军规? 以下是根据保密协议从游戏中发布的一些示例代码: 我试图用马里奥的“典型”来初始化SUPERMARIO,但我还没