几道java的改错题
1:下面的代码有什么错误?
java.util.ArrayList list =new java.util.ArrayList();
list.add("NewYork");
list.add(new java.util.Date());
java.util.ArrayList list1 = (java.util.ArrayList)(list.clone());
System.out.println(list == list1);
System.out.println(list.get(0)== list1.get(0));
System.out.println(list.get(1) == list1.get(1));
2:为什么下面两行代码可以编译,却会导致运行错误?
Number numberRef = new Integer(0);
Double doubleRef = (Double)numberRef;
3:为什么下面两行代码可以编译,却运行错误?
Number[] numberArray = new Integer[2];
numberArray[0] = new Double(1.5);
[解决办法]
1
应该是编译警告,可以运行的
2
因为编译期间编译器只知道numberRef是Number类型,不知道它指向什么对象,所以只要符合语法,就可以编译,而运行期,因为numberRef指向的是Integer对象,强行转换就相当于把Integer对象转为Double,因为这是两种类型的对象(彼此之间不是父子关系),所以转换失败
3
解释同2
关键是要理解好编译期和运行期
[解决办法]
1、
1.5后引入泛型后,这里面很有警告,但是不影响运行和结果。
2、3
是一个的问题。编译通过不代表运行时就一定通过。编译通过,运行时报错的问题也很常见。
比如问题2,numberRef实际上是Integer类型,它不能强制转换成Double类型,如果Double是Integer的父类,那可以转,但这里显然不是。有时为了判断是否可以转换,可以有instanceof判断一下。