编译时间&运行时错误

时间:2011-04-11 18:46:36

标签: java

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行给出运行时异常而不是编译时错误?

3 个答案:

答案 0 :(得分:4)

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

您没有收到编译时错误,因为o1被定义为Object。所以在编译时,它可以保存从object派生的任何内容,实际上除了基本类型long,int,short,byte,char,double,float和boolean之外,它实际上是Java中的每个Type。因此,在编译时,对象似乎可能实际上是一个int []。

答案 1 :(得分:3)

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

答案 2 :(得分: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]);