当前位置: 代码迷 >> Java相关 >> [求助]一个简单的类型转换问题
  详细解决方案

[求助]一个简单的类型转换问题

热度:179   发布时间:2007-04-30 14:07:17.0
[求助]一个简单的类型转换问题
public class Test
{
public static void main(String[] args)
{
byte b=127;
byte c=126;
byte d=(byte)(b*c);
System.out.println(d); //为什么输出-126, 按我的想法上一步相乘应该会超出byte的范围,为什么没有报错呀?
}
}

大家帮我解决一下这个疑问..谢谢!

再添一个问题
which is true?
A. Any statement that may throw an Exception must be enclosed in a try block.
//Standard Exception (Runtime Exception) is not
B. Any statement that may throw an Error must be enclosed in a try block.
C. Any statement that may throw an RuntimeException must be enclosed in a try block.
D.No exception are subclass of Error.

答案写的是D...但Error类也有子类呀....如AnnotationFormatError, AssertionError, AWTError, CoderMalfunctionError, FactoryConfigurationError, FactoryConfigurationError, IOError, LinkageError, ServiceConfigurationError, ThreadDeath, TransformerFactoryConfigurationError, VirtualMachineError

应该选什么呢?


我多问个问题


public class Test
{
public static void main(String[] args)
{
int b=99999999;
int c=99999999;
int d = b*c; //b*c = 9999999900000001 这个数远远超出了int的最大值,为什么也不会报错呀?
System.out.println(d);
System.out.println(Integer.MAX_VALUE); //2147483647
}
}

[此贴子已经被作者于2007-4-30 23:46:23编辑过]

搜索更多相关的解决方案: 类型  

----------------解决方案--------------------------------------------------------
的确超出了范围,没有报错是因为你进行了强制转换。
我也觉得应该选D,Exception不是Error的子类。
----------------解决方案--------------------------------------------------------
楼上正解,不过我觉得这个题目的D答案给得实在是太唐突了吧,根本和题目的一点联系都没有,哪怕考 byte*byte超过byte范围自动转换成int也是好的呀

----------------解决方案--------------------------------------------------------
超出范围是不会报错,只是答案不正确 !!
----------------解决方案--------------------------------------------------------
答案D没错的,的确没有一个Exception是Error的子类,除非你多层继承了...无聊

Exception 继承自 Throwable
Throwable 继承自 Object


----------------解决方案--------------------------------------------------------
以下是引用神vLinux飘飘x在2007-4-30 22:15:56的发言:
答案D没错的,的确没有一个Exception是Error的子类,除非你多层继承了...无聊

Exception 继承自 Throwable
Throwable 继承自 Object

API上写public class AnnotationFormatError extends Error

按你的说法 AnnotationFormatError 不算是Error的子类,而是算Throwable的子类是吗?

谢谢~~



----------------解决方案--------------------------------------------------------
AnnotationFormatError 继承自 Error ,当然是Error的子类,同时也是Throwable的子类
不知道从我的言论怎么能推导出你的观点-_-!

有任何疑问么?

----------------解决方案--------------------------------------------------------

以下是引用神vLinux飘飘x在2007-4-30 23:29:45的发言:
AnnotationFormatError 继承自 Error ,当然是Error的子类,同时也是Throwable的子类
不知道从我的言论怎么能推导出你的观点-_-!

有任何疑问么?

明白了,是我理解错了..答案D写的是没有一个exception是error的子类.. 我误以为AnnotationFormatError 是exception了..

谢谢指点!


我多问个问题
高手再指点我下..
public class Test
{
public static void main(String[] args)
{
int b=99999999;
int c=99999999;
int d = b*c; //b*c = 9999999900000001 这个数远远超出了int的最大值,为什么也不会报错呀?
System.out.println(d);
System.out.println(Integer.MAX_VALUE); //2147483647
}
}

高手再指点我下..


----------------解决方案--------------------------------------------------------
这个也是很简单的道理,因为Java进行乘法运算的时候,会把他们的运算结果当成是int进行存储(他们也的确是int),关键就是运算的结果是按照什么来保存。
Java选择的是用int进行保存,这样问题就来了:

1.当是两个byte <operator> byte的时候,Java会先把计算结果保存成为int类型。这样,由int转换到byte会有精度损失,所以会出错误
2.当是两个int <operator> int的时候,Java也会先把计算结果保存成为int类型,但是,999999999*999999999计算出的结果不是int类型所能承受得了的,应该是用long进行存储,但是在存储之前就已经是int了,所以运算完之后直接就是int(不用说,精度已经损失),而int到int自然不会强制转换,所以不会报错。

所以,即使你的d用long类型,
long d = b*c;的运算结果也会损失精度的,除非进行强制转换通知JVM
long d = (long)b*c;

----------------解决方案--------------------------------------------------------

谢谢神vLinux飘飘x ,学习了~~~~~~~


----------------解决方案--------------------------------------------------------
  相关解决方案