2011-04-11 122 views
2
class Dims { 
    public static void main(String[] args) { 
     int[][] a = {{1,2,}, {3,4}}; 
     int[] b = (int[]) a[1]; 
     Object o1 = a; 
     int[][] a2 = (int[][]) o1; 
     int[] b2 = (int[]) o1; // Line 7 
     System.out.println(b[1]); 
    } 
} 

我对上面的Java代码有疑问。
为什么它会在第7行给出运行时异常而不是编译时错误?编译时间和运行时错误

+1

您有问题,或者您的家庭作业有问题? – 2011-04-11 18:48:18

+0

这是我正在阅读的Java书中的一个问题。这本书也有解决方案。 – Student 2011-04-11 18:52:05

回答

4

因为o1是一个int [] [],而不是int []。你得到的RuntimeException是一个ClassCastException,因为第一个是int数组的数组,而后者只是一个int数组。

您不会收到编译时错误,因为o1被定义为Object。所以在编译时,它可以包含从object派生的任何东西,事实上除了基本类型long,int,short,byte,char,double,float和boolean之外,其实都是Java中的所有类型。所以,在编译时,这个对象似乎可能实际上是一个int []。

3

您不能通过强制转换将二维数组转换为一维数组。您需要以某种方式将值复制到新的一维数组中。

1

无论您何时不使用强制转换,编译器都可以确定该使用是否有效。如果你使用了一个强制转换,你告诉编译器你知道你在做什么,它必须使用不同的类型作为参考。

int[][] a = {{1, 2,}, {3, 4}}; 
int[] b = a[1]; // no cast is used here and the compiler can tell this is valid. 
Object o1 = a; 
int[][] a2 = (int[][]) o1; // This cast is fine. 
int[] b2 = (int[]) o1; // My IDE warns this case may produce a ClassCastException. 
System.out.println(b[1]);