“case expressions must be constant expressions”,许多小伙伴可能有遇到像我这样的问题。我是在做二维码扫描出现这个问题的,我把二维码的demo改成库,然后clean就出现这个问题。报错代码如下:
@Override
public void handleMessage(Message message) {
switch (message.what) {
case R.id.decode:
decode((byte[]) message.obj, message.arg1, message.arg2);
break;
case R.id.quit:
Looper.myLooper().quit();
break;
default:
break;
}
}
我们把鼠标放在提示错误的代码行上,提示case expressions must be constant expressions,英文好一点点的小伙伴立马知道这个是说case表达式必须是常量表达式,这一点说的没错,可为什么就我把代码变成库才会报这个错呢?把lib选项勾掉再clean就又不报错了呢?id不都是常量的吗?呵呵,先让我带着这个疑问,先来看看问题怎么解决。
百度了许久都是说要把case里面的表达式改为常量,又或者说把lib的选项去掉,这两个方案适合别的情况。所以这两个解决方案都不是我想要的。嗯......让我们回到源头,他说case的表达式必须为常量,那我们就不用case,把它改为if-else不就可以了,于是这就得出我的解决方案。
有一个快捷方式可以把switch语句变成if-else,就是把鼠标放在switch上面,按住Ctrl+1,让系统自动转换哈(懒人自有方法哈哈哈)。
代码变成这样就不会报错了
@Override
public void handleMessage(Message message) {
if (message.what == R.id.decode) {
decode((byte[]) message.obj, message.arg1, message.arg2);
} else if (message.what == R.id.quit) {
Looper.myLooper().quit();
} else {
}
}
现在让我们回到之前那个为什么上?百度了许久终不知何原因,因此今天特地记下这个错误,如果有幸被哪位知道原因的大神看到,请花几秒钟跟我说下哈。
有个问题不弄清楚,不知为什么浑身不舒服,在StackOverflow上找到问题:http://stackoverflow.com/questions/9092712/switch-case-statement-error-case-expressions-must-be-constant-expression,我去对比了一下把代码变成lib的资源id,还真不一样:
public static int bg_color=0x7f050000;
public static int contents_text=0x7f050001;
public static int encode_view=0x7f050002;
public static final int bg_color=0x7f050000;
public static final int contents_text=0x7f050001;
public static final int encode_view=0x7f050002;
把普通项目变成lib时,里面的资源id就不再是常量,可这又是为什么呢?我们最终把问题变成了lib里面的资源id的定义为啥不是常量了。这个问题又百度不到了,呵呵,等知道再来记下。