PathFinding em java

1 resposta
java
Y

Olá, preciso fazer um Código com algoritmo de algoritmo de dijkstra para faculdade, o código esta pronto, mas deu um erro creio eu pela leitura do txt, não sei se a logica não esta correta mas não consigo fazer funcionar, talvez por ter ficado muito tempo vendo uma coisa só eu não esteja enxergando algo obvio.
O main esta desse jeito:

package djikstra;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import javax.swing.JOptionPane;

public class Main {

public static void main(String[] args) {

BufferedReader leitorArquivo = null;
try {
		File arquivo = new File(Main.class.getClassLoader().getResource("cidades").getFile()); //Obtem o caminho do documento cidades.txt
		leitorArquivo = new BufferedReader(new FileReader(arquivo)); //Abre o arquivo
		
		String linha = null;
		Grafo grafo = new Grafo();
		
		while((linha = leitorArquivo.readLine()) != null) {   //Leitura linha a linha do arquivo
			String[] split = linha.split(" ");    //Dividiu a linha pelos espaços
			String cidadeOrigem = split[0];
			String cidadeDestino = split[1];
			Double distancia = Double.parseDouble(split[2]);
			
			Vertice verticeDestino = grafo.getVertice(cidadeDestino);     //Verifica se o vertice de destino existe
			if(verticeDestino == null) {
				verticeDestino = new Vertice();
				verticeDestino.setNome(cidadeDestino);
				grafo.adicionarVertice(verticeDestino);
			}
			
			Vertice vertice = grafo.getVertice(cidadeOrigem);      //Verifica se o vertice de origem existe, se existir adiciona o vizinho
			if(vertice != null) {
				vertice.addVizinho(verticeDestino, distancia);
				continue; //
			}
			// Se a cidade de origem nao existir, aqui que e inserida
			vertice = new Vertice();
			vertice.setNome(cidadeOrigem);
			vertice.addVizinho(verticeDestino, distancia);
			
			grafo.adicionarVertice(vertice);      //Insere o vertice no grafo
		}
		leitorArquivo.close(); //Encerra a leitura do arquivo
		
		leitorArquivo = new BufferedReader(new FileReader(arquivo));    //Le o arquivo novamente, para inserir a cidade de origem como vizinho da cidade destino (bidirecional)
		while((linha = leitorArquivo.readLine()) != null) {
			String[] split = linha.split(" ");
			String cidadeOrigem = split[0];
			String cidadeDestino = split[1];
			Double distancia = Double.parseDouble(split[2]);
			
			Vertice vertice = grafo.getVertice(cidadeDestino);  //Obtem a cidade destino e adiciona a cidade origem como vizinho
			vertice.addVizinho(grafo.getVertice(cidadeOrigem), distancia);
		}
		
		Vertice origem = lerNomeCidade("Digite cidade origem", grafo);   //Leitura pelo teclado 
		Vertice destino = lerNomeCidade("Digite cidade destino", grafo);   //Leitura pelo teclado
		
		Double distancia = grafo.obterMenorDistancia(origem, destino);
		String resultado = "A distancia de "+ origem.getNome() +" ate " + destino.getNome() +" e de "+ distancia;   //Exibe o resultado
		
		JOptionPane.showMessageDialog(null, resultado);
	} catch(Exception e) {
		throw new RuntimeException(e);
	} finally {   //Libera o arquivo, se não fica preso em memoria
		if(leitorArquivo != null) {
			try {
				leitorArquivo.close();
			} catch (IOException e) {
			}
		}
	}
}

private static Vertice lerNomeCidade(String mensagem, Grafo grafo){
	//Enquanto não digitar uma cidade valida continua pedindo a cidade correta
	while(true) {
		String cidadeDigitada = JOptionPane.showInputDialog(mensagem);
		Vertice vertice = grafo.getVertice(cidadeDigitada);
		
		if(vertice == null) {
			JOptionPane.showMessageDialog(null, "Cidade nao encontrada!");
			continue;
		}
		
		return vertice;
	}
}

}

o erro que retorna é esse:

Exception in thread main java.lang.RuntimeException: java.lang.NullPointerException

at djikstra.Main.main(Main.java:70)

Caused by: java.lang.NullPointerException

at djikstra.Main.main(Main.java:18)

Agradeço desde já

1 Resposta

TerraSkilll

Quais são as linhas 70 e 18 do arquivo Main.java? Pois as mensagens de erro indicam que algum objeto está nulo nessas linhas.

Pra facilitar sua vida, separe a parte que lê o arquivo da que executa o algoritmo. Assim, fica mais fácil pra você entender onde mexer. Não precisa ser nada muito complexo, podem ser dois métodos separados: um pra ler o arquivo e criar o Grafo, e outro pra executar o algoritmo de Djikstra.

Abraço.

Criado 3 de setembro de 2018
Ultima resposta 3 de set. de 2018
Respostas 1
Participantes 2