PDA

Visualizza la versione completa : Java come lo risolvo sto problema


cielo81
05-03-2003, 23:33
Il problema Ŕ il seguente: ho un file di testo da dove reperire dei dati formato nel seguente modo

nome
voto
nome
voto
.
.

Il problema Ŕ quello di creare un oggetto studente, di caricare un vettore di tipo studente, ed stampare il nome ed il voto sia dal vettore che tramite due metodi che si trovino nella stessa classe dove si crea l'oggetto studente.
Io penso di aver risolto il problema ma l'errore che compare Ŕ il seguente.

java.lang.NumberFormatException: null at java.lang.Integer.parseInt(Integer.java:382) at java.lang.Integer.parseInt(Integer.java:463) at prova2.Studente.leggi(Studente.java:20) at prova2.Registro.main(Registro.java:34)Exception in thread "main"

Questo Ŕ il codice della classe registro

import java.io.*;
import java.util.*;
public class Registro {

public static void main(String args[])throws Exception {
//Leggo dal file i dati che mi servono
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Documents and Settings/GIULIANO1/Desktop/progetti/scuola.txt")));
//Una variabile di tipo String per il nome
String nome= "inizio";
//Una variabile di tipo intero dove inserire il voto
int voto= 0;
//Un vettore che sarÓ riempito di oggetti di tipo studente
Vector v = new Vector();
//Variabile di appoggio
Studente temp;

//Mi creo il primo oggetto Studente che mi servirÓ per richiamare il metodo leggi per creare gli altri oggetti Studente
Studente allievo = new Studente(nome, voto);
System.out.println();

while(allievo != null) {
//Comincio la creazione degli oggetti Studente
Studente allievo2 = allievo.leggi(br);
//Inserisco gli oggetti nel vettore
v.addElement(allievo2);
//Richiamo dei metodi della classe studente con il solo scopo di verificare il
//loro funzionamento ISTRUZIONE SUPERFLUA
System.out.println(allievo2.getNome() + " " + allievo2.getMedia() + " ");
//Assegnazione che dovrebbe permettermi di uscire dal ciclo
allievo = allievo2;
}
//Scorro il vettore e dovrei stampare
Enumeration enum = v.elements();
while(enum.hasMoreElements()) {
temp = (Studente) enum.nextElement();
System.out.println(temp.nome + " " + temp.voto);
}


}
}

Questo quello della classe Studente
import java.io.*;
class Studente {
public Studente(String nome, int voto){
this.nome = nome;
this.voto = voto;
}
public static Studente leggi(BufferedReader br)throws Exception{
String nome = br.readLine();
int voto = Integer.parseInt(br.readLine());
Studente newStudente = new Studente(nome, voto);
return newStudente;
}

public int getMedia(){
return voto;
}

public String getNome(){
return nome;
}
private String nome;
private int voto;
}

lelefante
06-03-2003, 12:29
Sarabbe meglio che evitassi di aprire due thread uguali, se vedi che non ottieni risposta con il primo, puoi sempre includere una altro messaggio (anche vuoto) per farlo tornare in cima alla lista.
Un' altra cosa: inserici il tuo codice tra i tag [ CODE ] e [ /CODE ] (senza spazi), in tal modo codice risultera' formattato e piu' semplice da comprendere.

Detto questo ti includo la soluzione al problema. Ci sono almeno due errori gravi, in quello che hai scritto tu: devi imparare ad usare la gestione degli errori con try e catch, visto che e' un meccanismo piuttosto potente, ti consente di scrivere codice piu' elegante e piu' robusto.



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

public class Registro {
public static void main(String args[])throws Exception {
//Leggo dal file i dati che mi servono
File myFile = new File("./studenti.txt");
BufferedReader br = new BufferedReader(new FileReader(myFile));
//Un vettore che sarÓ riempito di oggetti di tipo studente
Vector v = new Vector();

Studente allievo = Studente.leggi(br);

while(allievo != null) {
//Inserisco gli oggetti nel vettore
v.addElement(allievo);
System.out.println(allievo.getNome() + " " + allievo.getMedia() + " ");
//Assegnazione che dovrebbe permettermi di uscire dal ciclo
allievo = Studente.leggi(br);
}
try {
//ricorda di chiudere i file
br.close();
} catch(IOException eIO) {
eIO.printStackTrace(System.out);
}
//Scorro il vettore e dovrei stampare
Enumeration enum = v.elements();
while(enum.hasMoreElements()) {
allievo = (Studente) enum.nextElement();
System.out.println(allievo.getNome() + " " + allievo.getMedia());
}
}
}

class Studente {

private String nome;
private int voto;

public Studente(String nome, int voto){
this.nome = nome;
this.voto = voto;
}

public static Studente leggi(BufferedReader br) throws Exception{
String tmp = br.readLine();
//Se il file arriva alla fine, esce dal metodo restituendo null
if(tmp == null) return null;
String nome = tmp;
//Stessa considerazione di prima, se non c'e' il voto dopo il nome
tmp = br.readLine();
if(tmp == null) return null;
int voto = Integer.parseInt(tmp);
//inutile creare un oggetto solo per restituirlo
return new Studente(nome, voto);
}

public int getMedia(){
return voto;
}

public String getNome(){
return nome;
}
}


In questo modo funziona, se non capisci qualche correzione, chiedi pure.

Loading