Help com escrita e leitura de Arquivos

6 respostas
J

Boas, estou criando um programa para um cadeira da faculdade e estou com pequeno problema na escrita e leitura de ficheiros.

import java.io.*;
import java.util.*;

public class WritingAndReading {

	static ArrayList <Socio> listSocio;
	static Socio user;
	static File fSocio = new File("Socios.dat");

    public static void WriteSocio(ArrayList <Socio> lista) {
    	listSocio = lista;
    	try{
    		FileOutputStream fos = new FileOutputStream (fSocio);
    		ObjectOutputStream oos = new ObjectOutputStream (fos);
    		try{
    			for(int i = 0; i<listSocio.size();i++){
    				user = listSocio.get(i);
    				oos.writeObject(user);    				
    			}
    		}catch (IOException ioe){
    			System.out.println ("Erro ao inserir o sócio no ficheiro");
    		}
    		oos.close();
    		fos.close();
    	}catch (IOException ioe){
    		System.out.println ("Erro ao escrever o ficheiro Socios.dat");
    	}
    }
    
   public static ArrayList <Socio> ReadSocio(){
    	try{
    		FileInputStream fis = new FileInputStream (fSocio);
    		ObjectInputStream ois = new ObjectInputStream (fis);
    		try{
    			while((user = (Socio) ois.readObject())!= null){
    				listSocio.add(user);
    			}
    		}catch (IOException ioe){
    			System.out.println ("Ficheiro carregado");
    		}
    		ois.close();
    		fis.close();
    	}catch (IOException ioe){
    		System.out.println ("Erro na leitura do ficheiro Socios.dat");
    	}
    	return listSocio;
    }
}

Já agora fica aqui também fica a classe sócio

import java.util.*;
import java.io.*;

public class Socio implements Participacao, Serializable{
	
	private int numSocio;
	private int quantidade=0;
	private String nome, apelido, morada, contacto, dataRegisto;
	Data registo;

    public Socio() {
    }
    
    public void setNum(int n){			//atribui o numero de socio
    	numSocio = n;
    }
    
    public void setNome(String n){		//atribui o nome do socio
    	nome = n;
    }
    
    public void setApelido(String a){	//atribui o apelido do socio	
    	apelido = a;
    }
    
    public void setMorada(String m){	//atribui a morada do socio
    	morada = m;
    }
    
    public void setContacto(String c){	//atribui o contacto do socio
    	contacto = c;
    }
    
    public void setRegisto(int dia, int mes, int ano){	//atribui a data de registo do socio
    	registo = new Data(dia,mes,ano);
    	dataRegisto = registo.getData();
    }
    
    public void setRegistoSistema (){		//atribui a data do sistema ao registo do socio
    	registo = new Data();
    	dataRegisto = registo.getData();
    }
    
    public int getNum(){				//devolve o numero de socio
    	return numSocio;
    }
    
    public String getNome(){			//devolve o nome do socio
    	return nome;
    }
    
    public String getApelido(){			//devolve o apelido do socio
    	return apelido;
    }
    
    public String getMorada(){			//devolve a morada do socio
    	return morada;
    }
    
    public String getContacto(){		//devolve o contacto do socio
    	return contacto;
    }
    
    public String getRegisto(){			//devolve a data de registo do socio
    	return dataRegisto;
    }
    
    public void setQuant(){				//quantidade de jogos do socio
    	quantidade++;
    }
    
	public boolean tipoPart(){			//verifica se o socio é participante ou não
		boolean valido=false;
		if (quantidade>0){
			valido=true;
		}
		return valido;
	}
	
}

Alguém pode me dar uma ajuda com isso?

6 Respostas

Odyo

Qual o erro ?

a sua classe implementa Sirializable e salva e recupara objetos
do arquivo Socios.dat …

tive um problema parecido e era algo com o throws IOException.
mas posta o erro direitinho … talvez consiga te ajudar.

Felagund

Aposto que o erro é um NullPointerException.

Vc possui um ArrayList acima correto? (Por que não usar um List somente? List<Socio> socios = new ArrayList<Socio>())

no metodo read ele não foi criado, e vc faz um add.

inicialize a sua collection listSocio (utilizando o new) na classe WritingAndReading.

Considere também não utilizar tantas variaveis estaticos.

[]'s

J

Esse é o erro : unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
-> while((user = (Socio) ois.readObject())!= null){ em essa linha.

O mais estranho é que testei o método antes e funcionou bem e não dava esse erro.

Quanto as variáveis estáticas vou usar varias vezes essas variáveis e como estou a trabalhar com métodos estáticos tem de ser para não estar sempre repetindo.

L

Jslider:
Esse é o erro : unreported exception java.lang.ClassNotFoundException; must be caught or declared to be thrown
-> while((user = (Socio) ois.readObject())!= null){ em essa linha.

O mais estranho é que testei o método antes e funcionou bem e não dava esse erro.

Quanto as variáveis estáticas vou usar varias vezes essas variáveis e como estou a trabalhar com métodos estáticos tem de ser para não estar sempre repetindo.

O erro ja diz tudo, o metodo ois.readObject() lanca ClassNotFoundException que eh checada, logo vc tem que tratar.

Como o Felagund falou, provavelmente vai dar NPE em listSocio.add(user);, e como vc disse que antes funcionava, aposto que vc tinha isso antes (tratava Exception e nao IOException como esta tratando agora):

try{  
			                 while((user = (Socio) ois.readObject())!= null){  
			                     listSocio.add(user);  
			                 }  
			             }catch (Exception ioe){  
			                 System.out.println ("Ficheiro carregado");  
			             }
  • soh lembrando que tratando Exception ao inves de IOException nao vai corrigir o problema de NPE
J

Obrigado a todos pela ajuda mas como não estou chegando a raiz do problema vou falar com o meu professor sobre o assunto.

[]'s

L

Jslider:
Obrigado a todos pela ajuda mas como não estou chegando a raiz do problema vou falar com o meu professor sobre o assunto.

[]'s

Pera, vc nao entendeu entao qual eh o problema de compilacao…

Vamos supor que vc tem isso:

public class Main {
	static class MinhaExcecao extends Exception {

		private static final long serialVersionUID = 1L;

	}

	public static void main(String[] args) {
		facaAlgumaCoisa(2);
	}

	public static void facaAlgumaCoisa(int i) throws MinhaExcecao {
		if (i == 1) {
			throw new MinhaExcecao();
		}
	}
}

Ocorre erro de compilacao, por que?! eu estou chamando o metodo facaAlgumaCoisa e esse método diz: “olha, eu posso lançar uma exceção chamada MinhaExcecao”. O que ocorre? quando eu chamo esse metodo, o java diz: “puts esse metodo pode lançar exceção (MinhaExcecao) só que o programador não me disse o que fazer caso ocorra essa exceção, o que devo fazer, não vou compilar”.
Você pode fazer duas coisas com exceções checadas, ignorar e simplesmente lançar para cima (e ai o método que chamou seu método pode tratar), ou então vc trata a exceção com try catch.

Então para resolver esse prolema, o meu main poderia ser assim:

public static void main(String[] args) throws MinhaExcecao {
		facaAlgumaCoisa(2);
	}

Ou seja, ignoro e relanço a exceção (algo como, eu não sei o que fazer caso ocorra essa exceção, então eu vou lançar para cima).

A segunda alternativa com try catch

public static void main(String[] args) {
		try {
			facaAlgumaCoisa(2);
		} catch (MinhaExcecao e) {
			System.out.println("Ocorreu um problema");
			// trata o problema
		}
	}

Ou seja, eu trato a exceção, caso de algum problema, eu sei como tratar (bloco do catch).

Seu problema é o mesmo, o método ois.readObject() diz: “olha, eu posso lançar uma exceção ClassNotFoundException, o que vc vai fazer se eu lançar?”, no caso vc não esta fazendo nada, vai ter que tomar uma das duas decisões, ou vc trata (try catch), ou relança (throws).


O segundo problema pode ocorrer em runtime (tempo de execução).
Quando vc faz:

listSocio.add(user);

Vai dar NullPointerException (NPE), pois listSocio não foi iniciado, ele não esta referenciando uma lista, se voce imprimir ele vai aparecer null, toda variavel de instancia da classe (igual listSocio, user e fSocio) que seja um objeto vai ser iniciado com nulo (caso vc nao inicie), e vc nunca pode acessar nada a partir dessa variavel caso ela ainda nao referencie um objeto de verdade. Olhe a diferenca entre fSocio e listSocio, fSocio esta ok pois vc iniciou ele (new File…), listSocio esta nulo porque vc nao iniciou ele… o que fazer? inicie ele:

static ArrayList <Socio> listSocio = new ArrayList<Socio>();

bele?! :wink:

Criado 13 de maio de 2009
Ultima resposta 13 de mai. de 2009
Respostas 6
Participantes 4