跳到正文
全部文章

java语法及运行时错误记录

分析 Java 枚举 switch 标签、常量表达式要求与比较器契约违例等语法和运行时错误。

enum相关

an enum switch case label must be the unqualified name of an enumeration constant

private void Test(ColorType type){
switch (type){
case ColorType.GREEN:
break;
case ColorType.RED:
break;
case ColorType.ORANGE:
break;
default:
break;
}
}

解决

case语句中只能写枚举类定义的枚举值, 前面不能带类名限定, 在switch中已经确定了枚举的类型. 如果有两个枚举中都有同一个变量(比如GREEN)的话, 则无法确定判断的先后顺序.

private void Test(ColorType type){
switch (type){
case GREEN:
break;
case RED:
break;
case ORANGE:
break;
default:
break;
}
}

constant expression required

private void Test(int type){
switch (type){
case ColorType.GREEN.getCode():
break;
case ColorType.RED.getCode():
break;
case ColorType.ORANGE.getCode():
break;
default:
break;
}
}

解决方式 枚举值不是常量, 而case后面只能跟常量. 先将int型的type转换成枚举值, 再进行switch匹配

Comparison method violates its general contract!

在JDK7以后,实现Comparable接口后,要满足三个特性: 自反性, 对称性和传递性. 通常是因为没有满足对称性导致的, 如没有判断返回“相等”的情况

可以用System.setProperty(“java.util.Arrays.useLegacyMergeSort”, “true”), 或设置JVM参数-Djava.util.Arrays.useLegacyMergeSort=true来兼容JDK6及以前版本的代码, 因为JDK7之后默认使用的TimSort


原文发布于 SegmentFault