2013-04-11 180 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 2013-04-11 09:27:06

回答

1

pos是對象,而您試圖將其轉換HashSet<String>,使其上升ClassCastException

確定的是pos[targetPos3]不是HashSet

1

鑑於

Object[] pos = root;

(HashSet<String>) pos[targetPos3]

pos[targetPos3]不能是HashSet<String>。在不知道Object []數組實際包含什麼(爲什麼它不那麼具體?)以及你打算做什麼的情況下進一步回答你的問題是不可能的。

1

請嘗試調試代碼,並檢查單詞的數據類型..從錯誤日誌它顯示單詞的數據類型是對象(它可能是字符串或其他),你試圖將它分配給HashSet ..

1

從你的代碼和異常實際上你有pos [targetPos3]上的Object []。

您無法將其轉換爲HashSet。

0

您看到的東西是Object[][],它被傳入爲root

你得到Object[]之一(targetPos1)。

然後你得到一個ObjecttargetPos3)。

This Object然後您嘗試並投射到HashSet<String>,這會拋出ClassCastException

從例外是看起來像Object實際上是另一個Object[][Ljava.lang.Object;不能...),所以你似乎有一個Object[][][]中傳遞過來的根。或者第二維數組中的至少一些元素是Object[]

我建議你在轉換前做一個instanceof檢查,或者最好確定你實際傳入的數據結構是什麼,並將其轉換爲數據傳輸對象而不是多維數組,甚至不需要理解。

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 2013-04-11 10:16:50

+0

@ user1747976如果您使用的是像String這樣的java標準類型,那麼不需要..不要忘記用'HashSet [] pos = root;替換'Object [] pos = root;'' – 2013-04-11 14:56:37