본문 바로가기
Java/Java with Error

[해결 방법] java.lang.ClassCastException

by HJ0216 2023. 8. 15.

👉 기본 환경

- Language: Java

- IDE: Eclipse

 

 

⌨️ 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        Map<String, Integer> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            map.put(s, s.length());
        }
 
        String[] mapKeys = (String[]) map.keySet().toArray();
        Arrays.sort(mapKeys);
 
        List<Object> keys = new ArrayList<>();
        for (Object key : mapKeys) {
            keys.add(key);
        }
        Collections.sort(keys, ((k1, k2) -> (map.get(k1).compareTo(map.get(k2)))));
 
        for (Object key : keys) {
            bw.write(key + "\n");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

 

 

🖨️오류

 java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')

 

 

📡 원인

Object[]를 String[]로 바로 형변환 할 수 없음

 

 

📰 해결 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Main {
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        int N = Integer.parseInt(br.readLine());
 
        Map<String, Integer> map = new HashMap<>();
 
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            map.put(s, s.length());
        }
 
        String[] mapKeys = map.keySet().toArray(new String[0]);
        Arrays.sort(mapKeys);
 
        List<Object> keys = new ArrayList<>();
        for (Object key : mapKeys) {
            keys.add(key);
        }
        Collections.sort(keys, ((k1, k2) -> (map.get(k1).compareTo(map.get(k2)))));
 
        for (Object key : keys) {
            bw.write(key + "\n");
        }
 
        bw.flush();
        bw.close();
    }
 
}
 
 
 

String[] mapKeys = map.keySet().toArray(new String[0]);

    - Object[]를 String[]을 형변환하는 것이 아닌 개별 요소를 String으로 직접 지정하고 String[]에 저장

    - 요소 타입을 명시적으로 지정하면 map.keySet()에서 반환되는 요소들을 mapeys 배열에 복사

 

+ 배열의 크기를 0으로 지정한 이유

    - 실제 반환될 배열의 크기를 동적으로 조절하고자 0으로 지정

    - 컬렉션의 크기에 맞게 배열이 자동으로 생성되고 요소들이 복사되기 때문에 정확한 크기를 예측하거나 관리할 필요가 없음

 

+ String[] mapKeys = map.keySet().toArray(String s); 가 안되는 이유

    - toArray()의 매개변수는 T[] a이므로 배열을 전달하여 요소 타입을 추론하게 해야 함

 

 

 

📚 참고 자료

 

[Java] ArrayList의 toArray()

ArrayList는 자바로 개발을 하면서 가장 많이 쓰는 리스트의 구현 클래스 중 하나입니다. ArrayList 타입의 String 리스트를 배열로 변환하려 할때는 아래와 같이 사용합니다. ArrayList strs=new ArrayList(); st

jerry92k.tistory.com