这是Duration类中的方法toNanos

public long toNanos() {
    long tempSeconds = seconds;
    long tempNanos = nanos;
    // TODO: Here makes me confused
    if (tempSeconds < 0) {
        // change the seconds and nano value to
        // handle Long.MIN_VALUE case
        tempSeconds = tempSeconds + 1;
        tempNanos = tempNanos - NANOS_PER_SECOND;
    }
    long totalNanos = Math.multiplyExact(tempSeconds, NANOS_PER_SECOND);
    totalNanos = Math.addExact(totalNanos, tempNanos);
    return totalNanos;
}

我不明白为什么在秒为负值的情况下还需要做额外的工作.

正数的最大值是2^63-1,负数的最小值是2^63,看起来是从-2^63s,-1ns转到-2^63+1s,1000_000_000-1ns,但最终还是要参与计算.在我看来,这是没有意义的,因为Math.multiplyExactMath.addExact会在数字溢出时抛出异常,无论判断是否存在,它都不会改变

推荐答案

对于情况Duration.ofNanos(Long.MIN_VALUE)(以及导致相同秒数的一些更多情况),需要额外的工作.

Duration.ofNanos(Long.MIN_VALUE)存储为秒=-9223372037,Nanos=145224192.

简单的计算seconds*1_000_000_000将使长值的范围下溢(因此,朴素的Math.multiplyExact(seconds, NANOS_PER_SECOND)将抛出异常).但是Duration.ofNanos(Long.MIN_VALUE).toNanos()不应该引发异常,它应该返回Long.MIN_VALUE.

他们可以将条件写为if (tempSeconds <= -9223372037) { ... },并且它将产生相同的结果(即,对于相同的秒值和Nanos值抛出),但是这样的常量更难维护.

Java相关问答推荐

无法在Java中将hhmmss格式的时间解析为LocalTime

具有默认分支的JUnit代码覆盖率切换声明

强制Mockito返回null而不是emtpy list

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

如何判断一个矩阵是否为有框矩阵?

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

FALSE:它应该在什么时候使用?

AssertJ Java:多条件断言

Spring Boot Maven包

呈现文本和四舍五入矩形时出现的JavaFX窗格白色瑕疵

Spring data JPA/Hibernate根据id获取一个列值

如何在antlr4中跳过所有反斜杠-换行符而保留换行符?

虚拟线程应该很快消亡吗?

JNI:将代码打包成自包含的二进制文件

有谁能帮我修一下这个吗?使输出变得更加整洁

在应用程序运行时更改LookAndFeel

接受类及其接口的Java类型(矛盾)

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

如何在Spring Security中设置一个任何人都可以打开的主页?

控制器建议异常处理