java.lang.ClassCastException: Z 无法强制转换为 java.lang.String。

5

运行覆盖率(EclEmma)时,我遇到了一个错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String,而在运行Junit测试时则没有问题。

这是代码(类中的所有字段都是Strings):

@Override
public Map<String, String> getErrors() throws IllegalAccessException, IllegalArgumentException {

    Map<String, String> errors = new HashMap<String, String>();

    for (Field field : this.getClass().getDeclaredFields()) {
        field.setAccessible(true);
        String value = (String) field.get(this);

        if (value.equals("N")) {
            if (!errors.containsKey(field.getName())) {
                errors.put(field.getName(), value);
            }
        }
    }
    return errors;
}

代码是否混淆? - Henry
3个回答

8

问题在于,为了生成代码覆盖率,EclEmma会向您的类中添加一个字段private static final transient boolean[] $jacocoData

由于此字段仅出现在代码覆盖率运行期间,因此普通单元测试会通过,但是代码覆盖率运行会失败:原始代码不期望出现这种非字符串字段。

最佳解决方案是检查您所看到的字段是否真的是一个字符串字段,否则跳过对该字段值的测试:

for (Field field : this.getClass().getDeclaredFields()) {
    field.setAccessible(true);
    if (field.getType() != String.class) {
        continue;
    }
    String value = (String) field.get(this);

    if (value.equals("N")) {
        if (!errors.containsKey(field.getName())) {
            errors.put(field.getName(), value);
        }
    }
}

0

尝试做这个:

String value = "null";
if(field.get(this) != null)
    value = field.get(this).toString();

请使用这个:

String value = (String) field.get(this);

2
请注意,如果 field.get(this)null,则可能会失败。最好使用 Objects.toString(field.get(this)) - Andy Turner
@AndyTurner 你是怎么做到的,总是能够准确地回答问题,但声望还不到30k? :) - xenteros
@xenteros 需要每天达到最大值150天才能获得30k声望。如果我真的试图达到那个目标,我怀疑我还能不能保住工作 :) - Andy Turner
@xenteros 是的,我有。不,他们没有。 - Andy Turner
@OliverCharlesworth 谢谢。我添加了一个检查,如果字段值是字符串实例。 - co.zohar
显示剩余3条评论

0
最后,我检查了字段值是否是String的实例,并用函数toString()替换了强制转换为字符串的操作。
String value = null;
Object fieldValue = field.get(this);
if (fieldValue instanceof String) {
    value = fieldValue.toString();
}

if ("N".equals(value)) {
    if (!errors.containsKey(field.getName())) {
        errors.put(field.getName(), value);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接