Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中将int转换为long_Java_Int - Fatal编程技术网

在Java中将int转换为long

在Java中将int转换为long,java,int,Java,Int,这个问题有很多答案,我也看到过。我的代码一直在工作,但今天它突然抛出java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.Long 排队 return null == input.get(keyName) ? 0L : (long) input.get(keyName); 错误来自long input.getkeyName。我想知道为什么它突然开始破裂。long input.getkeyName我觉得这很好。 我本想做Inte

这个问题有很多答案,我也看到过。我的代码一直在工作,但今天它突然抛出java.lang.ClassCastException:java.lang.Integer不能转换为java.lang.Long 排队

return null == input.get(keyName) ? 0L : (long) input.get(keyName);
错误来自long input.getkeyName。我想知道为什么它突然开始破裂。long input.getkeyName我觉得这很好。 我本想做Integer input.getkeyName.longValue,但得到了java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer,因为映射有时包含长值。有什么建议吗

堆栈跟踪:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner.getLongValueFromMap(SyncDriverPartitioner.java:78) ~[classes/:?]
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner.partition(SyncDriverPartitioner.java:47) ~[classes/:?]
    at accountservice.adapter.batch.testJob.SyncDriverPartitioner$$FastClassBySpringCGLIB$$6f3315e4.invoke(<generated>) ~[classes/:?]
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.18.RELEASE.jar:4.3.18.RELEASE]

您可以利用以下事实:所有数字原语包装器都扩展了java.lang.Number:

为什么会突然出错,;实际上,唯一可能的原因是,在它开始失败之前,您总是将java.lang.Long对象放入输入映射,并且它发生了变化,所以您现在也将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

可以通过安全地声明映射类型来避免这种情况。如果您这样做,input.putkey,42将给出编译时错误。

我建议您:

return null == input.get(keyName) ? 0L : Integer.toUnsignedLong(input.get(keyName))
至少通过这种方式,您应该获得更多关于为什么不能将其转换为long而不仅仅是ClassCastException的信息

答案更新

根据您的评论,我猜您在处理地图之前必须检查地图中条目的类型,我建议如下:

    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));
这将允许您为不同类型的条目定义不同的操作,它可以扩展到您想要支持的任何类型。您还可以调整抛出的异常以提供相关信息

上面的代码片段向您展示了实际的类型,以便您可以扩展代码以支持该类型,或者找出该类型的某些内容进入地图的原因


应该注意的是,在将数据输入地图时,而不是从地图中取出数据时,这样做可能会更好。在这种情况下,您应该能够将地图更改为类型。对插补进行消毒总比以后处理混合数据类型的混乱要好。

我无法重现这一点,如果三元表达式的两个分支都返回相同的类型,我就不必担心会出现问题。请添加一个可复制的示例。input.getkeyName的类型是什么?在运行时,地图中有哪些对象?你有我们可以看的密码吗?请发布你的stacktrace和相关的代码没有突然发生的事情。你是唯一一个真正能够弄清楚发生了什么变化的人。好吧,我发现了问题。有人将数据库列数据类型从BIGINT更改为INTEGERInteger.toUnsignedLong,将int作为输入,但在我的示例中,input.getkeyName是对象作为映射。根据您的注释更新了答案不确定哪一个是最佳做法我也尝试了Long.valueOfinput.getkeyName.toString,效果很好。这种方法首先转换任何内容转换为字符串,然后将其再次解析为数字。它效率较低,但从维护的角度来看,风险更大。如果值不是一个数字呢?也许你不小心插进了一根线“你好,世界”。使用强制转换到数字,您会得到一条错误消息,该消息清晰且易于跟踪到映射中对象类型错误的根本原因。根据您的建议,您会得到一个NumberFormatException(数字格式异常)——您需要更长的时间才能找到原因——您在地图中放置了错误类型的对象。
    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));