Um pequeno Problema

6 respostas
M

Olá... sou iniciante em java <3 , estou fazendo um trabalho sobre grafos... tenho que implementar o algoritmo de kruskal... bom, deixando isso de lado, quando eu tento ler um arquivo, dou um split da frase, separando espaçõs e entao, eu estou tentando jogar para um array as informaçoes.. e está dando esse erro:

Entrou no read
Caminho: Cidades.txt
Esta no reader
Laie
Exception in thread "main" java.lang.NullPointerException
at Util.readFile.readTxt(readFile.java:26)
at lines.main(lines.java:14)

As classes:
import java.io.IOException;

import Util.readFile;
import Util.roads;

public class lines {
	public static void main(String[] args) throws IOException{
		Object V[];
		readFile Read = new readFile();
		
		//Diretório onde se encontra o arquivo TXT
		String F = "Cidades.txt";
		System.out.println("Entrou no read");
		V =  (Object[]) Read.readTxt(F);
		System.out.println("Chegou");

	}
}
package Util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Vector;

public class readFile extends roads{
	public Object readTxt(String F) throws IOException{
		System.out.println("Caminho: "+F);
		File file = new File(F);
		String line = null;
		roads r = null;
		Object V[] = null;
		
		try{
			FileReader reader = new FileReader(file);
			System.out.println("Esta no reader");
			BufferedReader leitor = new BufferedReader(reader);
			
			int j=0;
			while((line = leitor.readLine())!= null){
				String S[] = line.split(" ");
				System.out.println(S[0]);
				r.setC1(S[0]);
				r.setC2(S[1]);
				r.setDist(Integer.parseInt(S[2]));
				V[j] = r;
				j++;
			}
		
			leitor.close();
			reader.close();
		 } 
		catch (IOException e) {
			System.out.print("Erro: Não foi possível ler o arquivo!");
		}
		return V;
	}
}
package Util;

public class roads{
	private String c1;
	private String c2;
	private int dist;
	public roads() {

	}
		public void setC1(String c1) {
			this.c1 = c1;
		 }
		public String getC1() {
			return c1;
		 }
		public void setC2(String c2) {
			this.c2 = c2;
		}
		public String getC2() {
			return c2;
		}
		public void setDist(int dist) {
			this.dist = dist;
		 }
		public int getDist() {
			return dist;
		 }
}

Ja tentei procurar.. n achei nada tao especifico no forum =/

Alguem poderia me ajudar? sou novo mesmo em java ><'

6 Respostas

M

Opa,

Sua variável S está com valor nulo, veja o que line retorna que gera o erro. Coloque a linha antes da linha 26 e testes:

System.out.println(line);

daí você vai ter noção de qual é o conteúdo da linha e saberá como tratá-lo.

Abraços,

M

Não… ele não está… tanto que imprimi S[0], e saiu o texto correto… no Caso… era “Laie”

Pensei q o erro poderia ser na classe roads

S
public class TesteArrayObject {
	public static void main(String[] args) {
		Object v[] = null;
		
		v[0] = new String("Suelmar");
		
		System.out.println(v[0]);
	}
}

O erro e que você declarou um array de objeto e inicializou com null.
E depois tenta inserir objetos na posição do array…

M

ahm… realmente

outra duvida… qual a diferença de ‘Object V[]’ para ‘Object[] V’ ?

muda algo?

M

bah… to com outro problema que eu nao sei resolver =/

tenho uma classe edge

public class edge{
	protected String c1;
	protected String c2;
	protected int dist;
	public edge() {

	}
		public void setC1(String c1) {
			this.c1 = c1;
		 }
		public String getC1() {
			return c1;
		 }
		public void setC2(String c2) {
			this.c2 = c2;
		}
		public String getC2() {
			return c2;
		}
		public void setDist(int dist) {
			this.dist = dist;
		 }
		public int getDist() {
			return dist;
		 }
}

e tenha uma classe que le um arquivo e joga em um vetor varios edges(pelo menos deveria funcionar assim)

public class readFile extends edge{
	int cont;
	public Object readTxt(String F) throws IOException{
		File file = new File(F);
		String line = null;
		edge ed = new edge();
		Vector<edge> V = new Vector<edge>();
		cont=13;
		try{
			FileReader reader = new FileReader(file);
			BufferedReader leitor = new BufferedReader(reader);

			int j=0;
			
			while((line = leitor.readLine())!= null){
				String S[] = line.split(" ");
				ed.setC1(S[0]);
				ed.setC2(S[1]);
				System.out.println(S[0]);
				ed.setDist(Integer.parseInt(S[2]));
				V.add(ed);
				j++;
			}
		
			leitor.close();
			reader.close();
		 } 
		catch (IOException e) {
			System.out.print("Erro: Não foi possível ler o arquivo!");
		}
		return V;
	}
}

Mas só está pegando os ultimos elementos… =/
Quando eu debuguei, os edges estavam sendo substituidos…
Eu preciso que cada edge, seja um independete… como eu faço isso?

L

Experimenta trocar isso:

while((line = leitor.readLine())!= null){
            String S[] = line.split(" ");
            ed.setC1(S[0]);
            ed.setC2(S[1]);
            System.out.println(S[0]);
            ed.setDist(Integer.parseInt(S[2]));
            V.add(ed);
            j++;
         }

por isso

while((line = leitor.readLine())!= null){
            String S[] = line.split(" ");
            ed = new edge();
            ed.setC1(S[0]);
            ed.setC2(S[1]);
            System.out.println(S[0]);
            ed.setDist(Integer.parseInt(S[2]));
            V.add(ed);
            j++;
         }

repare que só coloquei um

ed = new edge();

a mais… pois vc estava alterando sempre o mesmo edge, quando vc adiciona na lista, ele adiciona a referencia e não a copia do objeto, logo sempre que vc alterava a referencia (fazendo os sets e tal), ele altera o que vc tem na lista, ja que saum todos objetos da mesma referencia… para ficarem diferente tem que ser objetos diferentes…

Criado 24 de junho de 2007
Ultima resposta 26 de jun. de 2007
Respostas 6
Participantes 4