Нахождение java .lang.ClassCastException в этой программе, кто-то может мне помочь? - PullRequest
0 голосов
/ 03 мая 2020

Я пишу код для графа, который может отображать город на основе идентификаторов, и у меня появляется эта ошибка, когда я ищу преемников вершины. Может кто-нибудь помочь мне, пожалуйста?

Точная проблема возникает в классе DataStructure, но я решил опубликовать весь код, только если вы увидите ошибку, где я не.

Это это ошибка, которую я получаю:

java.lang.ClassCastException: class java.lang.Long cannot be cast to
    class Node (java.lang.Long is in module java.base of loader
    'bootstrap'; Node is in unnamed module of loader
    java.net.URLClassLoader @3df5c641)
  at DataStructure.getSuccessors(DataStructure.java:19)
  at Main.main(Main.java:18)

Спасибо всем заранее!

У меня есть код:

import java.util.*;

public class Main {
    public static void main() {
        DataRead d = new DataRead();
        HashMap<Long, Node> vertex = d.readVertex();
        System.out.println(vertex.size());
        ArrayList<Triplet<Long, Long, Double>> edges = d.readEdges();
        System.out.println(edges.size());
        DataStructure e = new DataStructure(vertex, edges);
        System.out.println(e.adjGraph.size());
        System.out.println(vertex.get(new Long(287291920)).id);

        Long l = new Long(287291920);
        Long l2 = new Long(1397149003);

        ArrayList<Long> test1 = e.getSuccessors(l);
        System.out.println(test1.size());

        for(Long i : test1) {
            System.out.println(i);
        }
        System.out.println("Distance: " + e.getDistance(l, l2));
    }
}

public class Node {    
    Long id;

    public Node(Long id) {
        this.id = id;
    }
}

public class Triplet<a, b, c> {

    private final a first;
    private final b second;
    private final c dist;

    public Triplet(a first, b second, c dist) {
        this.first = first;
        this.second = second;
        this.dist = dist;
    }

    public a getFirst() {
        return first;
    }

    public b getSecond() {
        return second;
    }

    public c getDistance() {
        return dist;
    }
}

import java.util.*;
import java.io.*;
import java.lang.Object;

public class DataRead {
    public HashMap<Long, Node> readVertex() {
        BufferedReader br = null;
        HashMap<Long, Node> vertex = new HashMap<>();

        try {
            br = new BufferedReader(new FileReader("Vertices.txt"));
            String line;
            int count = 0;

            while((line = br.readLine()) != null) {
                String[] arr = line.split(" ");
                Long id = Long.parseLong(arr[0]);
                Node v = new Node(id);
                vertex.put(v.id, v);
            }

            br.close();
        } catch (IOException e)  {
            System.out.println("Your file couldn't be found");
        }

        return vertex;
    }
    public ArrayList<Triplet<Long, Long, Double>> readEdges() {
        ArrayList<Triplet<Long, Long, Double>> edges = new ArrayList<>();

        try {
            BufferedReader br = new BufferedReader(new FileReader("Arcos.txt"));
            String line;

            while((line = br.readLine()) != null) {
                String[] arr = line.split(" ");
                Long origin = Long.parseLong(arr[0]);
                Long destination = Long.parseLong(arr[1]);
                Double dist = Double.parseDouble(arr[2]);
                Triplet<Long, Long, Double> t = new Triplet(origin, destination, dist);
                edges.add(t);
            }

            br.close();
        } catch (IOException e)  {
            System.out.println("Your file couldn't be found");
        }

        return edges;
    }
}

import java.util.*;

public class DataStructure {

    ArrayList<Triplet<Node, Node, Double>> adjGraph = new ArrayList<>();

    public DataStructure (HashMap<Long, Node> vertex, ArrayList<Triplet<Long, Long, Double>> edges) {
        for(Triplet<Long, Long, Double> t : edges) {
            Triplet<Node, Node, Double> triplet = new Triplet(t.getFirst(), t.getSecond(), t.getDistance());
            adjGraph.add(triplet);
        }
    }

    public ArrayList<Long> getSuccessors (Long Vid) {
        ArrayList<Long> successors = new ArrayList<>();

        for(int i = 0; i < adjGraph.size(); i++) {
            Triplet<Node, Node, Double> t = adjGraph.get(i);
            if(Vid == adjGraph.get(i).getFirst().id) {
                successors.add(adjGraph.get(i).getSecond().id);
            }
        }

        return successors;
    }

    public Double getDistance(Long sourceID, Long destinationID){
        for(int i=0; i < adjGraph.size(); i++){
            if((sourceID == adjGraph.get(i).getFirst().id) && (destinationID == adjGraph.get(i).getSecond().id)){
                return adjGraph.get(i).getDistance();
            }
        }
        return -1.0;
    }
}

1 Ответ

0 голосов
/ 03 мая 2020

Проблема в том, что в вашем коде есть несколько непроверенных преобразований:

javac -Xlint:unchecked *.java
DataRead.java:41: warning: [unchecked] unchecked call to Triplet(a,b,c) as a member of the raw type Triplet
                Triplet<Long, Long, Double> t = new Triplet(origin, destination, dist);
                                                ^
  where a,b,c are type-variables:
    a extends Object declared in class Triplet
    b extends Object declared in class Triplet
    c extends Object declared in class Triplet
DataRead.java:41: warning: [unchecked] unchecked conversion
                Triplet<Long, Long, Double> t = new Triplet(origin, destination, dist);
                                                ^
  required: Triplet<Long,Long,Double>
  found:    Triplet
DataStructure.java:9: warning: [unchecked] unchecked call to Triplet(a,b,c) as a member of the raw type Triplet
            Triplet<Node, Node, Double> triplet = new Triplet(t.getFirst(), t.getSecond(), t.getDistance());
                                                  ^
  where a,b,c are type-variables:
    a extends Object declared in class Triplet
    b extends Object declared in class Triplet
    c extends Object declared in class Triplet
DataStructure.java:9: warning: [unchecked] unchecked conversion
            Triplet<Node, Node, Double> triplet = new Triplet(t.getFirst(), t.getSecond(), t.getDistance());
                                                  ^
  required: Triplet<Node,Node,Double>
  found:    Triplet
Note: Main.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
4 warnings

Это приводит к "загрязнению кучи", когда вы получаете значение неправильного типа в одном из полей одного ваших родовых c классов.

Я думаю, что я вижу, в чем собственно проблема, но , так как это ваша домашняя работа Я оставлю это вам, чтобы прочитать предупреждения компиляции выше и выяснить, что вы сделали неправильно.

(Подсказка: вы используете Triplet непоследовательно ...)

Урок здесь заключается в том, что вы НЕ должны игнорировать предупреждения компилятора о непроверенных преобразованиях, и т. Д. c при использовании generi c типов. Компилятор в основном говорит: «Я не знаю, правильно ли это». А если код неправильный, вы получите исключение приведения класса во время выполнения в неожиданном месте.

...