相关疑难解决方法(0)

当交换机用于枚举时,默认值的用法是什么?

假设我有一个Color包含2个可能值的枚举:REDBLUE:

public enum Color {
    RED,
    BLUE
}
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个这个枚举的switch语句,其中我有两个可能值的代码:

Color color = getColor(); // a method which returns a value of enum "Color"
switch (color) {
case RED:
   ...
   break;

case BLUE:
   ...
   break;

default:
   break;
}
Run Code Online (Sandbox Code Playgroud)

由于我对枚举的两个可能值都有代码块,default上面代码中的用法是什么?

如果代码以某种方式到达default块,我应该抛出异常吗?

Color color = getColor(); // a method which returns a value of enum "Color"
switch (color) {
case RED:
   ...
   break;

case BLUE:
   ...
   break;

default:
   throw new IllegalArgumentException("This should not …
Run Code Online (Sandbox Code Playgroud)

java enums

59
推荐指数
9
解决办法
9104
查看次数

为什么此代码中的枚举开关需要默认值?

通常,switch语句中不需要default.但是,在以下情况下,代码只有在取消注释默认语句时才能成功编译.谁能解释为什么?

public enum XYZ {A,B};
public static String testSwitch(XYZ xyz)
{
    switch(xyz)
    {
    case A:
        return "A";
    case B:
    //default:
        return "B";
    }
}
Run Code Online (Sandbox Code Playgroud)

java enums default switch-statement

37
推荐指数
4
解决办法
2万
查看次数

返回类型为 void 的 switch 表达式

当 switch 分支调用具有 void 返回类型的方法时,有没有办法强制对所有枚举值进行彻底检查?仅仅为了诱使编译器要求穷举而对产量进行硬编码是非常丑陋的。

这是我当前的模式(句柄方法具有 void 返回类型)

int unused = switch (event.getEventType()) {
    case ORDER   -> { handle((OrderEvent) event); yield 0; }
    case INVOICE -> { handle((InvoiceEvent) event); yield 0; }
    case PAYMENT -> { handle((PaymentEvent) event); yield 0; }
};
Run Code Online (Sandbox Code Playgroud)

我想使用表达式的原因是在添加新枚举值但未处理时出现编译错误。

java void switch-statement switch-expression java-16

30
推荐指数
3
解决办法
1625
查看次数

强制彻底切换

是否有注释或其他方法将非详尽的switch语句警告转换为错误?如果没有在开关中正确处理所有值,我想要某个方法或类产生错误.

例:

public enum E {
  A,
  B
}
Run Code Online (Sandbox Code Playgroud)

在代码的其他地方,有一个像这样的枚举的开关

switch (enumValue) {
case A: /* do something */ break;
}
Run Code Online (Sandbox Code Playgroud)

Java会向您发出警告,指示此开关不处理所有枚举值.我想将此警告变为错误(永久,无论各个IDE设置如何).

请记住,在这种情况下我无法更改原始文件enum,所以我希望编译器强制执行它.

java enums

7
推荐指数
3
解决办法
2653
查看次数

如何检测新值已添加到枚举中,并且不在交换机中处理

我不时要在项目的枚举类型中添加一个新值.

public enum Day {
  SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 
   FILENOTFOUND //this one is new one
}
Run Code Online (Sandbox Code Playgroud)

我想要的是每个我没有处理新值的开关都有编译时错误,如下所示:

switch (color) {
        case MONDAY: 
        case TUESDAY: 
        case WEDNESDAY: 
        case THURSDAY: 
                    System.out.println("Mondays are bad.");
                     break;

        case FRIDAY: System.out.println("Fridays are better.");
                     break;

        case SATURDAY:
        case SUNDAY: System.out.println("Weekends are best.");
                     break;
    } 
Run Code Online (Sandbox Code Playgroud)

有一个默认:抛出一些异常是不够好的,我希望它是编译时间.

我不认为这是可能的,但也许有人有一个巧妙的把戏......

我认为Findbugs有一个规则可以找到那些,但我只看到了这个: Eq:为枚举定义的协变equals()方法(EQ_DONT_DEFINE_EQUALS_FOR_ENUM)

编辑:我选择了马克的回复,我确实使用了Eclipse,听起来就像我需要的那样!我根本不是findbugs的专家,所以我可能错过了这样的功能,尽管我不这么认为.

java enums findbugs compilation

6
推荐指数
1
解决办法
1668
查看次数

有没有办法强制你在Java中切换枚举的所有定义值?

假设你有一个包含3个值的枚举:

enum Colors { RED, GREEN, BLUE }
Run Code Online (Sandbox Code Playgroud)

你在某种方法中切换它的所有值,认为你已经处理了所有情况:

switch (colors) {
    case RED: ...
    case GREEN: ...
    case BLUE: ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您在枚举中添加一个新值:

enum Colors { RED, GREEN, BLUE, YELLOW }
Run Code Online (Sandbox Code Playgroud)

除了你在方法中默默地错过一个案例之外,一切仍然编译得很好YELLOW.有没有办法在这种情况下引发编译时错误?


编辑:不明白为什么这被标记为欺骗我可以在Java中添加和删除运行时枚举的元素.由于答案是"否",这意味着应该可以在编译时知道枚举的所有值,因此我要求编译器/某些代码分析工具可以实现, ?

java enums switch-statement

6
推荐指数
2
解决办法
103
查看次数

切换后的"缺少退货声明"(枚举) - 为什么?

编译器声称在结尾处缺少return语句MyClass.parse().这是代码:

package de.hs_rm.safelyovertaken.ble;

import android.support.annotation.NonNull;

import java.util.Arrays;

class MyClass {

    @NonNull
    static MyClass parse(byte[] encoded) throws MyParseException {

        MyEnum myEnum = MyEnum.parse(Arrays.copyOfRange(encoded, 0, 2));

        switch (myEnum) {
            case A:
                return new MyClassA();

            case B:
                return new MyClassB();

            case C:
                return new MyClassC();
        }

        // compile error: "Missing return statement"

//        return null; // should never be reached
//        throw new AssertionError("Should never be reached");
    }
}

enum MyEnum {
    A, B, C;

    @NonNull
    static MyEnum parse(byte[] encoded) throws …
Run Code Online (Sandbox Code Playgroud)

java enums compiler-errors

3
推荐指数
1
解决办法
420
查看次数