2011-07-27 33 views
0

我试图运行我已经在Java中做了一个程序,但我不知道发生了什么,它 是给我下面的错误:的Java的ArrayList

Exception in thread "main" java.lang.ClassCastException: 
java.lang.String cannot be cast to java.util.ArrayList 

下面是代码:

public static ArrayList connections(ArrayList list3) { 

     ArrayList connections = new ArrayList(); 
     int row1 = 1; 
     int row2 = 0; 
     int col = 0; 

     connections.add(new ArrayList()); 
     ((ArrayList)connections.get(0)).add(0); 
     ((ArrayList)connections.get(0)).add(1); 

     System.out.print(((ArrayList)connections.get(0)).get(0)); 

     while(row1 < list3.size()) { 


      if(((ArrayList)list3.get(row1)).get(col).equals(((ArrayList)connections.get(row2)).get(col))){ 
       connections.add(((ArrayList)list3.get(row1)).get(1)); 
       row1++; 
      } 

      else { 
       connections.add(new ArrayList()); 
       connections.add(((ArrayList)list3.get(row1)).get(0)); 
       row2 = row1; 
       row1++; 
      } 
     } 

     return connections; 
    } 

看来,错误是在if语句。有人可以帮助我吗?

+1

如果您查看异常的堆栈跟踪,它应该显示错误在哪一行。这有助于发现错误。 –

+2

使用[泛型](http://www.oracle.com/technetwork/articles/javase/generics-136597.html)将帮助您避免这些错误。 –

+1

我看到括号:O – Jacob

回答

3
if(((ArrayList)list3.get(row1)).get(col).equals(((ArrayList)connections.get(row2)).get(col))){ 

应该读

if(((ArrayList)list3.get(row1)).get(col).equals((((ArrayList)connections).get(row2)).get(col))){ 

你是第一个铸造connections.get(2行),而不是铸造的连接,然后做在一个ArrayList中获得。

编辑 - 您绝对应该重构代码以使用Java 1.5功能,即泛型。如果这不是一个选项,您应该重构代码以使其更易读 - 例如:您的方法称为“connections”,然后将您的变量称为“connections”

2

您还应该使用泛型而不是cast。这样,如果你这样做,并且你的代码将是类型安全的,你将在编译时得到一个错误。泛型只是指定您正在使用的编译器类型,以便在编译时检查类型。

例子:

ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 
list.add(new ArrayList<Integer>()); 

list.get(0).add(0); 
list.get(0).add(1); 
list.get(0).add(2); 

更多generics here.

希望这有助于。