这个问题有很多答案,我已经看到了。我有一直在工作的代码,但是今天突然它开始抛出fromBase64
loadFromBase64
错误来自java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
。我不知道为什么它突然开始崩溃。 return null == input.get(keyName) ? 0L : (long) input.get(keyName);
这对我来说很好。
我本来打算做(long) input.get(keyName)
,但由于地图有时包含(long) input.get(keyName)
值,所以得到((Integer) input.get(keyName)).longValue()
。有什么建议
Stacktrace:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
答案 0 :(得分:4)
您可以利用所有数字原始包装都扩展java.lang.Number
的事实:
return null == input.get(keyName) ? 0L : ((Number) input.get(keyName)).longValue();
为何突然开始出现错误;实际上,唯一可能的原因是直到失败之前,您总是将java.lang.Long
个对象放置在input
映射中,并且它发生了变化,因此您现在也将java.lang.Integer
放置在其中。
使用自动装箱和数字常量很容易做到这一点:
long v = 42;
input.put("key", v); // Puts a java.lang.Long in the map
input.put("key", 42); // Puts a java.lang.Integer in the map
input.put("key", 42L); // Puts a java.lang.Long in the map
您可以通过安全地声明地图类型(Map<String, Long>
)来避免这种情况。如果这样做,input.put("key", 42)
将给出编译时错误。
答案 1 :(得分:0)
我建议不要将整数强制转换为长整数
return null == input.get(keyName) ? 0L : Integer.toUnsignedLong(input.get(keyName))
至少通过这种方式,您应该获得更多有关为何不能将其转换为long而不是ClassCastException的信息
答案更新
根据您的评论,我想您需要在处理Map之前检查Map中的条目类型,我建议以下内容:
Object keyValue = input.get(keyName);
if (null == keyValue) return 0L;
String valueType = keyValue.getClass().getTypeName();
if (valueType.equals(Long.class.getTypeName())) {
return (long) keyValue;
}
if (valueType.equals(Integer.class.getTypeName())) {
return Integer.toUnsignedLong((int) keyValue);
}
throw new TypeMismatchException(String.format("Type '%s' is not supported...", valueType));
这将使您为不同类型的条目定义不同的操作,它可以扩展到您要支持的任何类型。您还可以调整抛出的异常,以向您提供相关信息。
上面的代码段向您显示了实际的类型,以便您可以扩展代码以支持该类型,或者弄清楚为什么这种类型的内容进入了地图。
应该注意的是,将数据输入到地图中而不是从地图中取出数据时,这样做可能会更好。在这种情况下,您应该可以将地图更改为type。与以后处理混合数据类型杂乱无章的做法相比,最好还是对您的输入进行清理。