我有一个方法,它应该采用表示条形码的字符串参数,并返回该字符串的等效数字。代码如下:
public int codeToDigit (String code) throws IOException
{
switch (code)
{
case "||:::": return 0;
case ":::||": return 1;
case "::|:|": return 2;
case "::||:": return 3;
case ":|::|": return 4;
case ":|:|:": return 5;
case ":||::": return 6;
case "|:::|": return 7;
case "|::|:": return 8;
case "|:|::": return 9;
}
}
我对两件事感到困惑。首先,我应该把它作为默认值?现在,我只有10个占位符。但这不正确。此外,当我编译它时,我收到以下错误:
BarCode.java:56:不兼容的类型 发现:java.lang.String 必需:int 开关(代码)
他们显然是不兼容的类型?关于如何解决这个问题的任何输入?谢谢你的帮助!
编辑:很多人提到升级到Java 7,我已经完成了。我正在使用Java 7并刚刚更新了Update 51.但是,我仍然遇到同样的问题。答案 0 :(得分:2)
要回答您的问题,您不能switch
在String
版本的java< SE 7所以你应该升级。如果没有,请转换为if / else。
其次,删除所有break
语句,因为即使您解决了这个问题,这些语句也会引发编译错误。
最后,如果没有合法的回报,你应该在默认列中抛出某种错误。 IllegalArgumentException
可能是合适的
答案 1 :(得分:1)
在Java 1.7+中,您会收到有关break;
无法访问的其他编译器错误(由于您的return
语句,它们是不必要的),如前所述。你可以删除它们,它们编译得很好。
但是,在Java 1.6及更早版本中,您会收到不兼容的类型错误。这是因为String
s in case
statements were supported in Java only starting with 1.7。
要解决此问题,请将Java升级到至少1.7,或者为您的代码尝试数值或枚举。
答案 2 :(得分:0)
如果可以的话,正如其他答案所述:升级到Java 7.如果没有别的,为了安全性和便利性而做(具有讽刺意味的是,这两件事可能来自相同的结果)。
但是,如果由于某种原因,升级您的Java版本不是一种选择(如果您使用的是学校的实验室机器,或者依赖于教师的话,可能不会选择升级您的Java版本。 s编译器正确处理它,你也可以创建一个包含字符串作为数据的枚举,用简单的"解析"将你的字符串转换为正确的枚举成员。方法,然后切换枚举,而不是。
这可能只会复制您的问题,但它是一种有效的方法。
我不会假装已经破解了(或者说有人)Java 1.7编译器,但足以说它生成"来自使用String对象的switch语句通常更高效的字节码来自链接的if-then-else语句" (source)。
然而,切换枚举也可以很好地工作,但我不知道你是如何设法命名来代表你的数据,就像你在这里一样。