2013-04-11 3 views
-2

오류 : java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.HashSet 줄에 (HashSet<String>) pos[targetPos3]).contains(word)이 있습니다.클래스 캐스팅 예외 HashSet

public void search(String word, Object[] root){ 
    int targetPos1; 
    int targetPos2; 
    Object[] pos = root; 

    targetPos1 = word.charAt(0) -'a'; 
    targetPos2 = word.charAt(1) -'a'; 
    int targetPos3 = word.charAt(2) - 'a'; 

    if(root[targetPos1]==null){ 
     System.out.println("1st letter NOT FOUND"); 
    } 
    else{ 
     pos = (Object[]) root[targetPos1]; 
     if(pos[targetPos2]==null){ 
      System.out.println("2nd letter NOT FOUND"); 
     } 
     else{ 
      if(((HashSet<String>) pos[targetPos3]).contains(word)){ 
       System.out.println("Word FOUND: " + word); 
       System.out.println(pos[targetPos3]);//output children 
      } 
      else{ 
       System.out.println("NOT FOUND"); 
      } 
     } 
    }//end of else 

} 
+0

어디에서이 메서드를 호출합니까? 루트 란 무엇입니까? – BobTheBuilder

답변

1

pos는 객체이고 당신은 그것을 HashSet<String>을 변환하려고하고 ClassCastException을 올렸다.

pos[targetPos3]은 아니고 HashSet입니다.

1

을 감안할 때

Object[] pos = root;

(HashSet<String>) pos[targetPos3]

pos[targetPos3]

HashSet<String>이 아니어야합니다. Object [] 배열이 실제로 무엇을 포함하고 있는지 (왜 그렇게 구체적이지 않은 것입니까?) 무엇을하고자하는지 알지 못하면 질문에 더 대답 할 수 없습니다.

1

코드 디버깅을 시도하고 단어의 데이터 유형을 확인하십시오. 오류 로그에서 단어의 데이터 유형이 객체인지 (String인지 다른 것일 수 있음) 보여 주며이를 HashSet에 지정하려고합니다. ..

1

코드와 예외에서 실제로 pos [targetPos3]에 Object []가 있습니다.

캐스팅 할 수 없습니다.

0

root으로 전달되는 Object[][]의 모습으로 보았습니다.

Object[] 중 하나가 표시됩니다 (targetPos1에 있습니다).

그런 다음 중 하나 (targetPos3에있는 하나)를 얻습니다.

Object 다음에 HashSet<String>으로 전송하려고 시도하면 ClassCastException이 표시됩니다. 그 Object 실제로 다른 Object[] ([Ljava.lang.Object;이 ... 수 없습니다) 그래서 당신은 Object[][][] 루트로 전달 된 것 같다 것처럼 예외에서

이다 보인다. 또는 적어도 두 번째 차원 배열의 일부 요소는 Object[]입니다.

캐스팅 전에 확인하거나, 실제로 전달중인 데이터 구조를 해결하고 데이터 전송 객체로 만드는 것이 좋습니다. 다차원 배열이 아닌 알다.

0
당신이 할 수없는

:

if ((HashSet<String>) pos[targetPos3]).contains(word)) 

을하지만이 시도 :

다음
private class ArrayTools 
{ 
    public static<T> boolean contains (T [] array, T key) 
    { 
     for (T item : array) 
     { 
      if (item.equals(key)) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

당신이 이런 식으로 작업을 수행 할 수 있습니다

if (ArrayTools.contains(pos[targetPos3], word)) 

참고 : 할 수 있습니다 ' 원시와 함께 사용하지 마십시오.

+0

여기에서 equals와 hashcode를 재정의해야합니까? – Dodi

+0

@ user1747976'String'과 같은 자바 표준 타입을 사용하고 있다면 필요 없다.'Object [] pos = root;를'HashSet [] pos = root;로 대체하는 것을 잊지 마라. –

관련 문제