繁体   English   中英

switch case 语句错误:case 表达式必须是常量表达式

[英]switch case statement error: case expressions must be constant expression

我的 switch-case 语句昨天工作得很好。 但是当我今天早上早些时候运行代码时,eclipse 给了我一个错误,用红色强调 case 语句并说:case 表达式必须是常量表达式,它是常量我不知道发生了什么。 这是我的代码如下:

public void onClick(View src)
    {
        switch(src.getId()) {
        case R.id.playbtn:
            checkwificonnection();
            break;

        case R.id.stopbtn:
            Log.d(TAG, "onClick: stopping srvice");
            Playbutton.setImageResource(R.drawable.playbtn1);
            Playbutton.setVisibility(0); //visible
            Stopbutton.setVisibility(4); //invisible
            stopService(new Intent(RakistaRadio.this,myservice.class));
            clearstatusbar();
            timer.cancel();
            Title.setText(" ");
            Artist.setText(" ");
            break;

        case R.id.btnmenu:
            openOptionsMenu();
            break;
        }
    }

所有 R.id.int 都标有红色下划线。

在常规的 Android 项目中,资源 R 类中的常量声明如下:

public static final int main=0x7f030004;

但是,从 ADT 14 开始,在库项目中,它们将像这样声明:

public static int main=0x7f030004;

换句话说,常量在库项目中不是最终的。 因此,您的代码将不再编译。

解决方案很简单:将 switch 语句转换为 if-else 语句。

public void onClick(View src)
{
    int id = src.getId();
    if (id == R.id.playbtn){
        checkwificonnection();
    } else if (id == R.id.stopbtn){
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
    } else if (id == R.id.btnmenu){
        openOptionsMenu();
    }
}

http://tools.android.com/tips/non-constant-fields

您可以使用以下命令快速将switch语句转换为if-else语句:

在日食中
将光标移动到switch关键字并按Ctrl + 1然后选择

将“开关”转换为“if-else”。

在 Android Studio 中
将光标移动到switch关键字并按Alt + Enter然后选择

将“开关”替换为“如果”。

在项目属性中取消选中“是库”对我有用。

解决方法可以是这样:

  1. 只需分配Integer
  2. 使变量最终

例子:

public static final int cameraRequestCode = 999;

希望这会帮助你。

这个问题的简单解决方案是:

单击开关,然后按CTL+1,它会将您的开关更改为 if-else 块语句,并将解决您的问题

R.id.*,因为 ADT 14 不再被声明为 final static int,所以你不能在 switch case 构造中使用。 您可以改用 if else 子句。

这个其他解决方案如何保持漂亮的开关而不是 if-else:

private enum LayoutElement {
    NONE(-1),
    PLAY_BUTTON(R.id.playbtn),
    STOP_BUTTON(R.id.stopbtn),
    MENU_BUTTON(R.id.btnmenu);

    private static class _ {
        static SparseArray<LayoutElement> elements = new SparseArray<LayoutElement>();
    }

    LayoutElement(int id) {
        _.elements.put(id, this);
    }

    public static LayoutElement from(View view) {
        return _.elements.get(view.getId(), NONE);
    }

}

所以在你的代码中你可以这样做:

public void onClick(View src) {
    switch(LayoutElement.from(src)) {
    case PLAY_BUTTTON:
        checkwificonnection();
        break;

    case STOP_BUTTON:
        Log.d(TAG, "onClick: stopping srvice");
        Playbutton.setImageResource(R.drawable.playbtn1);
        Playbutton.setVisibility(0); //visible
        Stopbutton.setVisibility(4); //invisible
        stopService(new Intent(RakistaRadio.this,myservice.class));
        clearstatusbar();
        timer.cancel();
        Title.setText(" ");
        Artist.setText(" ");
        break;

    case MENU_BUTTON:
        openOptionsMenu();
        break;
    }
}

枚举是静态的,因此这将产生非常有限的影响。 唯一需要关注的窗口是涉及的双重查找(首先在内部 SparseArray 上,然后在切换表上)

也就是说,如果需要,通过保留对 id 的引用,此枚举也可用于以流畅的方式获取项目……但这是其他时间的故事。

当我在类中声明变量的函数中使用 switch 时,它抛出了这个错误:

private void ShowCalendar(final Activity context, Point p, int type) 
{
    switch (type) {
        case type_cat:
            break;

        case type_region:
            break;

        case type_city:
            break;

        default:
            //sth
            break;
    }
}

当我在类的开头对变量声明final时,问题就解决了:

final int type_cat=1, type_region=2, type_city=3;

我想提一下,当我尝试在我的项目中添加一个库时,我遇到了同样的情况。 突然间所有的 switch 语句开始显示错误!

现在我试图删除我添加的库,即使那样也不起作用。 如何“当我清理项目时”所有错误都消失了!

只需将变量声明为final

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM