Возможно, переменная не была инициализирована (график, взвешенный по ребрам)

Поэтому я пытаюсь сделать программу, которая находит MST. Чтобы построить график, я использую набор ребер и читаю график из файла, используя этот код:

import edu.princeton.cs.algs4.*;

class MyEdgeWeightedGraph {
    private final int V;
    private final int E;
    private Bag<MyEdge> edges;

    public int V() {
        return V;
    }
    public int E() {
        return E;
    }

    public Iterable<MyEdge> edges() { 
        return edges; 
    }

    public MyEdgeWeightedGraph(In in) {
        int E = in.readInt();
        int V = in.readInt();
        if (E < 0) {
            throw new IllegalArgumentException("Number of edges must be nonnegative");
        }
        for (int i = 0; i < E; i++){
            int v = in.readInt();
            int w = in.readInt();
            long weight = in.readLong();
            MyEdge e = new MyEdge(v, w, weight);
            edges.add(e);
        }
    }
}

Поскольку я использую пакет ребер, я использую класс пакета (отсюда и метод добавления): http://algs4.cs.princeton.edu/code/edu/princeton/cs/algs4/Bag.java.html

Проблема в том, что всякий раз, когда я его компилирую, он говорит «ошибка: переменная V, возможно, не была инициализирована» для строки 32. Теперь, поскольку метод MyEdgeWeightedGraph вызывает метод добавления в классе сумки, ему не нужен оператор возврата, так как пришел, я продолжаю получать эту ошибку?


person David Rolfe    schedule 02.03.2016    source источник


Ответы (1)


В вашем конструкторе, когда вы пишете

    int E = in.readInt();
    int V = in.readInt();

вы создаете локальные переменные с именами E и V, которые затеняют поля E и V. В результате после завершения работы конструктора значения E и V, которые вы объявили final, не были инициализированы, отсюда и ошибка.

Чтобы это исправить, удалите типы и просто напишите

    E = in.readInt();
    V = in.readInt();

Это должно решить вашу проблему.

person templatetypedef    schedule 02.03.2016