Java 为什么我从system.out.println()和system.exit()得到两个不同的值?
当我在unix中运行代码时,Java 为什么我从system.out.println()和system.exit()得到两个不同的值?,java,unix,Java,Unix,当我在unix中运行代码时,system.exit(Integer.parseInt(e.getMessage())给出254 输出: System.out.println(Integer.parseInt(e.getMessage())); System.out.println(e.getMessage()); System.exit(Integer.parseInt(e.getMessage())); 二进制级别的转换从int转换为byte(254是-2整数的低级字节) 请注意,这种情况
system.exit(Integer.parseInt(e.getMessage())
给出254
输出:
System.out.println(Integer.parseInt(e.getMessage()));
System.out.println(e.getMessage());
System.exit(Integer.parseInt(e.getMessage()));
二进制级别的转换从int
转换为byte
(254是-2整数的低级字节)
请注意,这种情况在java中不会发生(本机的
Shutdown.halt0
方法接收int),因为在不同的平台上可能会有所不同。您的操作系统的退出代码是无符号8位整数,因此唯一有效的退出代码是0..255
得到254的原因是因为它是int
-2的低8位被视为无符号数
-2
-2
254
由于System.exit()需要在0-255之间取正值,
-2
在实践中会变成256-2=254
,这是通常发生的情况。理论上,javadocs并没有指定正在发生的事情。。。在其他平台上可能会有所不同。如果我希望-2作为system的结果接收,我应该在上面的代码中执行什么操作。如果我希望-2作为system.ext()的结果接收,我应该执行什么操作?-2不能由8位无符号数表示。唯一有效的选项是0..255。
$ for q in -2 -1 0 1 2 253 254 255 256 257 ; do
perl -e'exit $ARGV[0]' -- $q
printf '%3d => %3d\n' $q $?
done
-2 => 254
-1 => 255
0 => 0
1 => 1
2 => 2
253 => 253
254 => 254
255 => 255
256 => 0
257 => 1