【问题标题】:ClassCastException : cant be cast to java.lang.IntegerClassCastException:不能转换为 java.lang.Integer
【发布时间】:2015-04-16 14:44:44
【问题描述】:

我知道这个问题在 stackoverflow 中被问了很多,但我找不到适合我的问题的答案。

在下面的代码中,我无法打印出ArrayList<Integer> 中的每个项目,因为它说的是"Edge cannot be cast to java.lang.Integer"

我尝试使用for(Integer item :p1)for (int item: p1) 打印每个项目,但两者都不起作用。

我认为问题可能是因为 Edge 类中的 toString() 方法,但如果我不使用 toString(),我无法获得真正的密钥编号(它将打印为 Edge@28a418fc 或类似的东西)

感谢您之前的帮助

主类

public class Ranker7 {

    static Graph g;
    static Node n;
    static Edge e;
    static HashMap<Integer, Node> nodeMap; 
    int id;
    static double weight;
    static int year;
    static int type;

    Ranker7() {
            g = new Graph();
            nodeMap = new HashMap<Integer, Node>();
            n = new Node(id,year,type,weight);
    }

    public static void main (String[] args) throws Exception{

        long startTime = System.currentTimeMillis();

        /**Rule Mining**/
        Ranker7 Ranker = new Ranker7();
        Connection connect = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        PreparedStatement preparedStatement2 = null;
        ResultSet resultSet2 = null;
        HashMap nodeMap =  new HashMap();  

        System.out.println("Processing...");
        Class.forName("com.mysql.jdbc.Driver");
        connect = DriverManager.getConnection("jdbc:mysql://localhost/arnetminer?"+"user=root&password=1234");
        preparedStatement = connect.prepareStatement("Select fr,t,ty from subedge");

        resultSet = preparedStatement.executeQuery();
        int i=0;

        while(resultSet.next()) {
           g.addEdgeForIndexing(resultSet.getInt(1),resultSet.getInt(2),resultSet.getInt(3));         
           i++;             
           System.out.println( "edges added to G = "+i);
        }       

        System.out.println("Loaded " + g.nodeCount() + " nodes.");

        preparedStatement = connect.prepareStatement("Select node,year,type from subnode2");
        resultSet = preparedStatement.executeQuery();
        int h=0;
        while(resultSet.next()) {
               Node n = new Node(resultSet.getInt(1), resultSet.getInt(2),resultSet.getInt(3),weight);
               int key1=resultSet.getInt(1);
               nodeMap.put(key1,n);
               h++;             
        }

        System.out.println(nodeMap);
        System.out.println(nodeMap.size());

        Scanner sc = new Scanner(System.in);

        System.out.println("How many authors do you want to enter?");
        int num = sc.nextInt();
        int[] authorNames = new int[num];
        for(int a = 0; a < authorNames.length; a++){
            System.out.println("Enter author name:");
            authorNames[a] = sc.nextInt();
        }

        System.out.println("Year : ");
        int inputYear3 = sc.nextInt();

        ArrayList<Integer> p1 = new ArrayList<Integer>();
        /**Get the papers written by input author A-P**/    
        for(int b=0; b< authorNames.length;b++){
            int AuthorID1 = authorNames[b];
            p1 = g.getOutEdgesToP(AuthorID1);
        }

        for(int item : p1){ //the error of classcastexception is here
            System.out.println(item); 
        }

    }
}

边缘类

public class Edge {


    int from;
    int to;
    int type;
    private static int counter = 0;
    public Edge(int from, int to, int type) {
        this.from = from;
        this.to = to;
        this.type = type;
    //  System.out.println("edges added from " + from + " to " +  to + " with type "+ type);
    }

    public String toString(){
        String repr = Integer.toString(to);
        return repr;
    }
    public int getfrom(){
        return from;
    }

    public int getto(){
        return to;
    }

    public int getType(){
        return type;
    }

    public void setfrom(int from){
        this.from = from;
    }

    public void setto(int to){
        this.to = to;
    }

    public void setType(int type){
        this.type = type;
    }
}

图表类

import java.lang.reflect.Field;
import java.util.*;

public class Graph {

    private HashSet<Integer>  nodeIDs;   
    public HashMap<Integer, String> nodeIDsWithTN;
    public HashMap<Integer, String> TNMap;  
    private HashMap<Integer, ArrayList<Integer>>  edges;
    private HashMap<Integer, ArrayList<Integer>>  reverse;
    private int numNodes;
    private int numEdges;
    private int numReverse;

    public Graph() {
        edges = new HashMap<Integer, ArrayList<Integer>>();
        reverse = new HashMap<Integer, ArrayList<Integer>>();
        nodeIDs = new HashSet<Integer>();
        nodeIDsWithTN = new HashMap<Integer, String>();
        TNMap = new HashMap<Integer, String>();
        new HashSet();
    }

    public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException {   

            Edge e = new Edge(from,to,T);
            nodeIDs.add(e.from);
            nodeIDs.add(e.to);

            ArrayList tmp = null;
            if (edges.containsKey(e.from))
              tmp = (ArrayList) edges.get(e.from);
            else {
              tmp = new ArrayList();
              edges.put(e.from,tmp);
            }
            tmp.add(e);

            ArrayList tmp2 = null;
            if (reverse.containsKey(e.to))
              tmp2 = (ArrayList) reverse.get(e.to);
            else {
              tmp2 = new ArrayList();
              reverse.put(e.to,tmp2);
            }
            tmp2.add(e);

    }

    public int nodeCount() {
        if(nodeIDs.size() > 0) 
            return nodeIDs.size();
            // else return numNodes;
        return numEdges;
    }

    public int countInEdges(Integer key) {
        if (!reverse.containsKey(key)) return 0;
            return ((ArrayList<?>) reverse.get(key)).size();
    }

    public int countOutEdges(Integer key) {
        if (!edges.containsKey(key)) return 0;
            return ((ArrayList<?>) edges.get(key)).size();
    }
/**
    public ArrayList<String> getInEdgesFromPtoA(String id) {
        if (!reverse.containsKey(id)) return null;  
            ArrayList<String> a = reverse.get(id);
            ArrayList<String> result = new ArrayList<String>();
                for(int j=0;j<a.size();j++){
                      if(a.get(j).startsWith("A")){
                          result.add(a.get(j));                           
                      }
                 }
        return result;
    }
**/

      public ArrayList<Integer> getOutEdges(Integer key) {
            if (!edges.containsKey(key)) 
                return null;

            ArrayList<Integer> value = edges.get(key);
            return value;
      }


      public ArrayList<Integer> getOutEdgesToP(int id) {
            if (!edges.containsKey(id)) {
                return null;
            }

            ArrayList<Integer> a = edges.get(id);           
            System.out.println ("Arraylist a: " + a); //if i print using this its okay. but i cant get each item in this ArrayList like below
            for(int item : a){ //the error of classcastexception is here
                System.out.println(item);
            }

            return a;
     }

    public Iterator<Integer> nodeIteratorInitial() {
        return nodeIDs.iterator();
    }
}

节点类

public class Node {

      int id;
      double weight;
      int year;
      int type;
      private static int counter = 0;

      public Node(int id,int year,int type,double weight) {
          this.id = id;
          this.year=year;
          this.weight = weight;
          this.type = type;
     }

      @Override
      public String toString() {
          // here you can create your own representation of the object
          String repr = "id:" + id + ", year:" + year + ", weight:" + weight + ", node type:" + type;
          return repr;
          }

    public double getWeight(){
            return weight;
      }

      public int getid() {
           return id;
      }

      public int getType() {
           return type;
      }

      public int getYear() {
           return year;
      }

      public void setWeight(double weight){
         this.weight=weight;
      }

      public void setid(int id){
          this.id=id;
      }

      public void setType() {
           this.type=type;
      }
}

【问题讨论】:

  • 您是否尝试过使用 `for(Integer item : p1)` 而不是 `for(int item : p1)` ?
  • @mtyurt 是的,我都试过了..
  • 您使用了很多原始类型...为什么? (例如在 Graph#addEdgeForIndexing 中)
  • @Tom 我创建了程序,但是对于 addEdgeForIndexing 方法,我实际上从其他地方得到了参考。我会尽力解决这个问题,谢谢。
  • @fuschia 原始类型通常是邪恶的根源,因此您应该尽量避免它们。我想这个问题是一个很好的例子,为什么这会导致问题:)。

标签: java


【解决方案1】:
private HashMap<Integer, ArrayList<Integer>>  edges;

// ...later

Edge e = new Edge(from,to,T);

// ...later

else {
    tmp = new ArrayList();
    edges.put(e.from,tmp);
}
tmp.add(e);

最终,这是why raw types are bad 的经典示例。你有一个ArrayList&lt;Integer&gt;,你把Edges 放进去。

很遗憾,我不知道如何告诉您如何解决它,因为我不明白您要做什么。

【讨论】:

  • 我创建了程序,但对于 addEdgeForIndexing 方法,我实际上从其他地方得到了参考。我会尽力解决这个问题,谢谢。
  • 我猜是仔细检查逻辑。例如,edges 应该是 HashMap&lt;Integer, ArrayList&lt;Edge&gt;&gt;
  • 好收获! @fuschia 正如 Radiodef 提到的那样,使用原始类型是不好的做法(结果就是你现在遇到的这个烂摊子)。对每个集合/映射使用泛型,这些错误将在编译时被捕获并且会更清晰!
  • +(2-1) more for 我不明白你在做什么。
  • 谢谢这实际上是问题所在!当我为 tmp 定义类型时,它现在可以工作,但我的程序现在出现逻辑错误。我会尝试解决这个问题。重要的是ClassCastException问题解决了!非常感谢!
【解决方案2】:

错误就在这里

  public void addEdgeForIndexing(int from, int to, int T) throws IllegalArgumentException, IllegalAccessException {   

            Edge e = new Edge(from,to,T);
            nodeIDs.add(e.from);
            nodeIDs.add(e.to);

            ArrayList tmp = null;
            if (edges.containsKey(e.from))
              tmp = (ArrayList) edges.get(e.from);
            else {
              tmp = new ArrayList();
              edges.put(e.from,tmp);
            }
            tmp.add(e);//adding an edge to tmp

稍后在代码中,您将 ArrayList 作为 ArrayList 从 Map 中获取,但它是包含 Edge 的 ArrayList 尝试改变

tmp = new ArrayList();

tmp = new ArrayList<Integer>();

向其中添加 Edge 时应该会出现编译错误

【讨论】:

  • 谢谢这实际上是问题所在!当我为 tmp 定义类型时,它现在可以工作,但我的程序现在出现逻辑错误。我会尝试解决这个问题。重要的是ClassCastException问题解决了!非常感谢!
【解决方案3】:

您声明:

int from;
int to;
int type;

您应该将它们声明为Integers:

Integer from;
Integer to;
Integer type;

因为稍后你会这样做:

this.from = new Integer(from);

等等

更好的选择是将分配更改为:

this.from = from;

这也将解决此错误,因为您会将int 分配给int。您使用 new Integer() 有什么目的吗?因为如果不是 - 我建议删除它 - 与原始 int 相比,它会更慢(性能方面)。

底线:保持一致并在整个代码中使用 intInteger - 除非确实需要,否则尽量不要混合使用它们。

【讨论】:

  • 根据您的建议,我将所有内容更改为 int,因为我需要更好的性能。另外,我真的没有理由使用 new Integer()。但是ClassCastException的问题还是没能解决。谢谢,但我想我可能还错过了其他东西。
  • @fuschia 请把Node类的代码也贴出来
【解决方案4】:
    public ArrayList<Integer> getOutEdgesToP(int id) {
if (!edges.containsKey(id)) {
    return null;
}
System.out.println(edges.get(id));
ArrayList<Integer> a = edges.get(id);
System.out.println("Arraylist a: " + a); // if i print using this its
                     // okay. but i cant get each
                     // item in this ArrayList like
                     // below
for (Object item : a) { // the error of classcastexception is here
    System.out.println(item);
}

return a;
}

这应该可行。我没有太多时间去寻找解释。

【讨论】:

  • 谢谢!但我实际上需要它是 int 以便性能更好,因为我需要在那里循环很多项目。
猜你喜欢
  • 2012-03-19
  • 2014-08-29
  • 2018-01-01
  • 2012-05-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多