2011-04-11 7 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

질문이 있습니까, 아니면 숙제에 질문이 있습니까? –

+0

이것은 내가 읽고있는 Java Book의 질문 중 하나입니다. 이 책에는 또한 해결책이 있습니다. – Student

답변

4

o1은 int [] []이며 int []가 아니기 때문에. RuntimeException은 ClassCastException입니다. 첫 번째는 int 배열의 배열이고, 두 번째는 int 배열입니다.

o1이 Object로 정의되었으므로 컴파일 타임 오류가 발생하지 않습니다. 따라서 컴파일시에는 객체에서 파생 된 모든 것을 포함 할 수 있습니다. 사실 기본형 long, int, short, byte, char, double, float 및 boolean을 제외한 모든 Java 유형이 있습니다. 따라서 컴파일 타임에 객체가 실제로 int [] 일 수 있습니다.

3

캐스팅하여 2 차원 배열을 1 차원 배열로 변환 할 수 없습니다. 어떤 방식으로 값을 새로운 1 차원 배열에 복사해야합니다.

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]);