【问题标题】:Switch on enum in Java does not go to correct case在 Java 中打开枚举没有正确的大小写
【发布时间】:2015-03-24 07:38:49
【问题描述】:

我正在 Android Studio 中为 Android 编写一些代码,并且我有一个包含私有枚举的类 TaskType,我使用 getTaskType 将其拉出,如下面的代码所示:

public class TaskType {
    public enum taskType {NOT_SET, LOGIN_TASK, GET_USER_DETAILS_TASK}
    private taskType theTaskType= taskType.NOT_SET;

    public TaskType(taskType taskType){
        this.theTaskType= taskType;
    }

    public taskType getTaskType() {
        return theTaskType;
    }

    public void setTaskType(taskType newTaskType) {
        theTaskType = newTaskType;
    }
}

然后我将一个实例作为参数传递给回调并尝试打开它,如下面的代码所示:

public void callbackOnPostExecute(TaskType taskType){
    switch(taskType.getTaskType()){
        case LOGIN_TASK:
            mListener.callback(loginNetworkHelper);
        default:
            Log.e(TAG, "Unknown task type: " + taskType.getTaskType());
            error.setError(ErrorHelper.error.UNKNOWN_ERROR);
            mListener.callback(new NetworkHelper(error));
    }
}

这似乎编译得很好,Android Studio 甚至将 LOGIN_TASK 突出显示为紫色,就好像它知道它是什么一样。但是,默认情况下直接切换,我的 Log.e 语句有输出:

03-24 07:23:43.870    2636-2636/com.mydomain.myproject E/NetworkInterface﹕ Unknown task type: LOGIN_TASK

这使得它看起来好像正在使用正确的枚举值,但由于某种原因无法被 LOGIN_TASK 案例识别。

我在这个问题上做了很多搜索,但我只能找到关于如何在 Java 中打开枚举的教程,我想我已经遵循了。有人有意见吗?

谢谢!

【问题讨论】:

  • 谢谢大家,这绝对是我对自己的代码视而不见的情况。应该避而远之。

标签: java android enums switch-statement


【解决方案1】:

您忘记在 case 子句中添加 break 语句:

case LOGIN_TASK:
    mListener.callback(loginNetworkHelper);
    break;

default:
    Log.e(TAG, "Unknown task type: " + taskType.getTaskType());
    error.setError(ErrorHelper.error.UNKNOWN_ERROR);
    mListener.callback(new NetworkHelper(error));

如果您不以break 结束caseswitch 将调用所有case 分支,包括default 分支。关于switch 声明的文档可以在here 找到。

【讨论】:

  • @TristanMorgan 阅读文档可能会更快!
【解决方案2】:

您需要添加break 语句,否则它将始终以默认情况结束。

public void callbackOnPostExecute(TaskType taskType){
    switch(taskType.getTaskType()){
        case LOGIN_TASK:
            mListener.callback(loginNetworkHelper);
            break; // put a break here, and do this for every case clause other than default one. 
        default:
            Log.e(TAG, "Unknown task type: " + taskType.getTaskType());
            error.setError(ErrorHelper.error.UNKNOWN_ERROR);
            mListener.callback(new NetworkHelper(error));
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多