切换语句和不兼容的类型?

问题描述:

我有一个方法,应该采取代表条形码的字符串参数,并返回该字符串的等效数字。代码如下:切换语句和不兼容的类型?

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中 要求:整数 开关(代码)

他们是不兼容类型显然?有关如何解决这个问题的任何输入?谢谢您的帮助!

编辑:你们中许多人提到升级到Java 7,这是我做的事。我正在使用Java 7并更新了Update 51.但是,我仍然遇到同样的问题。

+0

作为一个旁注:你不必把所有这些'break'语句放在这里,因为它永远不会达到那个点,'return'会更快地停止它。 –

+0

这取决于你在这里试图完成什么。 switch语句取整数或一个字符。如果你试图在switch语句中查找整个字符串,我将不得不在eclipse打开时检查它。整数和字符很容易。你可以选择你正在寻找那个字符的任何角色。但我认为,如果我在寻找一组字符(字符串),我会转换并使用if语句。 –

+0

Java 1.7+允许'switch()' –

在Java 1.7及更高版本中,您会遇到其他编译器错误(break;)无法访问(因为您的return语句,它们是不必要的),如前所述。你可以删除它们,它会很好地编译。

然而,在Java 1.6之前,你得到的不兼容类型的错误。这是因为Strings in case statements were supported in Java only starting with 1.7

为了解决这个问题,升级您的Java在1.7以上,或者尝试一个数值或者您的代码的枚举。

要回答你的问题,你不能switchString s在版本的java < SE 7所以你应该升级。如果不是,则转换为if/else。

其次,删除所有break语句,因为即使你解决这个问题,这些将抛出一个编译器错误。

最后,你应该抛出某种默认列错误的,如果没有legitamate回报给。一个IllegalArgumentException可能是合适的

如果你可以,正如其他答案所述:升级到Java 7.如果没有别的,做它的安全性和方便性(讽刺,因为它可能是,这两件事情来从相同的结果)。但是,如果出于某种原因升级您的Java版本不是一种选择(它可能不是,如果您使用学校的实验室机器,或依靠教师的编译器正确处理它),您也可以创建一个具有字符串作为数据的枚举,用简单的“分析”方法将字符串转换为适当的枚举成员,然后切换枚举。

这可能只是复制您的问题,但它是一个有效的方法。我不会假装已经对Java 1.7编译器进行了开放(或者说给有人的开放),但足以说它从“使用String对象的开关语句中产生”通常更高效的字节码,而不是来自链接的if- then-else语句“(source)。

然而,在枚举开关也工作得非常好,虽然我不知道你怎么弄到的命名代表以同样的方式你的数据像你一样,在这里...