PDA

View Full Version : [Java] Lettura da file e ClassCastException


NaNNy86
08-03-2006, 00:08
Salve a tutti, ritorno con i miei solito problemi sul java ( il 21 ho l'esame e devo passarlo a tutti i costi )!

Allora vi posto i miei due file: il primo è la classe Tratta e il secondo è la classe Main composto da vari metodi tra cui quello di lettura ( lettura di un array di Tratta, appunto).

Tratta.java:

public class Tratta implements java.io.Serializable {

protected String sigla;
protected String citta1;
protected String citta2;
protected int distanza;

public String getSigla(){
return sigla;
}
public String getCitta1(){
return citta1;
}
public String getCitta2(){
return citta2;
}
public int getDistanza(){
return distanza;
}


public Tratta(String siglaL, String citta1L, String citta2L, int distanzaL){

sigla = siglaL;
citta1 = citta1L;
citta2 = citta2L;
distanza = distanzaL;
}

public String altraCitta(String a){
if (citta1.compareToIgnoreCase(a) == 0){
return citta2;
}
if (citta2.compareToIgnoreCase(a) == 0){
return citta1;
}
else return null;
}

public String toString(){
return "La tratta che parte da " +getCitta1() + " e arriva a " + getCitta2() + ", dista " +getDistanza() + "km.";
}
}


Prima domanda, devo implementare la Serializeble anche se il file è in lettura?

Main.java:

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

public class Main{

public static void main(String arg[]) throws FileNotFoundException, IOException{

elencoCitta(leggiRete(arg[0]));

}


public static Vector leggiRete(String nomefile) throws FileNotFoundException, IOException{

//BufferedReader input = null;

//try{

BufferedReader input = new BufferedReader(new FileReader(nomefile));
Vector v = new Vector();
String buffer;
while ((buffer = input.readLine())!=null){
StringTokenizer stk = new StringTokenizer(buffer);

String sigla = stk.nextToken().trim();
String citta1 = stk.nextToken().trim();
String citta2 = stk.nextToken().trim();
int distanza = Integer.parseInt(stk.nextToken().trim());
v.add( new Tratta(sigla, citta1, citta2, distanza));
}
input.close();
return v;

}

public static Tratta[] elencoCitta(Vector v){

Tratta[] elenco = new Tratta[v.size()];
elenco = (Tratta[])v.toArray();
for(int i=0; i<elenco.length; i++){
System.out.println(elenco[i]);
}
return elenco;
}
}


Infine un esempio di txt:

A29 Bologna Rimini 50
A01 Bologna Milano 160
A34 Milano Torino 140


Quando vado a lanciare il mio Main, immettendo da riga di comanda il nome del file, mi lanca una ClassCastException, ma io non riesco a capire dove sia il problema....
Grazie in anticipo delle risposte,
NaNNy :)

^TiGeRShArK^
08-03-2006, 02:06
io l'ho risolto usando i generics..ma forse funziona anche senza usarli :p

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

public class Main{

public static void main(String arg[]) throws FileNotFoundException, IOException{

elencoCitta(leggiRete(arg[0]));

}


public static Vector leggiRete(String nomefile) throws FileNotFoundException, IOException{

//BufferedReader input = null;

//try{

BufferedReader input = new BufferedReader(new FileReader(nomefile));
Vector<Tratta> v = new Vector<Tratta>();
String buffer;
while ((buffer = input.readLine())!=null){
StringTokenizer stk = new StringTokenizer(buffer);

String sigla = stk.nextToken().trim();
String citta1 = stk.nextToken().trim();
String citta2 = stk.nextToken().trim();
int distanza = Integer.parseInt(stk.nextToken().trim());
v.add( new Tratta(sigla, citta1, citta2, distanza));
}
input.close();
return v;

}

public static Tratta[] elencoCitta(Vector <Tratta> v){

Tratta[] elenco = new Tratta[v.size()];
elenco = v.toArray(elenco);
for(int i=0; i<elenco.length; i++){
System.out.println(elenco[i]);
}
return elenco;
}
}

La tratta che parte da Bologna e arriva a Rimini, dista 50km.
La tratta che parte da Bologna e arriva a Milano, dista 160km.
La tratta che parte da Milano e arriva a Torino, dista 140km.

NaNNy86
08-03-2006, 10:44
Grazie comunque del tuo aiuto, ma non avendo fatto a lezione i generics ( non sò minimamente cosa siano ) dovrei trovare una soluzione senza di essi....

Altre idee?

NaNNy86
08-03-2006, 12:34
uppete :D

rdefalco
08-03-2006, 15:44
uppete :D

eccolo qui:

public static Tratta[] elencoCitta(Vector v){
Tratta elenco[] = new Tratta[v.size()];
elenco = (Tratta[]) v.toArray(elenco);
for(int i=0; i<elenco.length; i++){
System.out.println(elenco[i]);
}
return elenco;
}

il metodo toArray può avere come parametro opzionale un array da prendere ad esempio per il tipo di dato da usare. Sembra funzionare, altrimenti mi mandi un MP o uppi il thread.

NaNNy86
08-03-2006, 19:28
FUNZIONA!! Grazie mille !!!!

^TiGeRShArK^
09-03-2006, 01:57
eccolo qui:

public static Tratta[] elencoCitta(Vector v){
Tratta elenco[] = new Tratta[v.size()];
elenco = (Tratta[]) v.toArray(elenco);
for(int i=0; i<elenco.length; i++){
System.out.println(elenco[i]);
}
return elenco;
}

il metodo toArray può avere come parametro opzionale un array da prendere ad esempio per il tipo di dato da usare. Sembra funzionare, altrimenti mi mandi un MP o uppi il thread.

infatti intendevo quello come soluzione senza generics, bastava togliere quello ke avevo scritto tra <> :D
scusa se nn sono stato kiaro, ma io preferisco sempre usare i generics, anke quando non strettamente necessario xkè ritengo ke migliorino la leggibilità del codice....
non sapevo ke non aveste fatto i generics all'univ... :fiufiu:

rdefalco
09-03-2006, 13:58
infatti intendevo quello come soluzione senza generics, bastava togliere quello ke avevo scritto tra <> :D
scusa se nn sono stato kiaro, ma io preferisco sempre usare i generics, anke quando non strettamente necessario xkè ritengo ke migliorino la leggibilità del codice....
non sapevo ke non aveste fatto i generics all'univ... :fiufiu:

Neanche io ho idea di cosa siano i generics... spiegazione?

Angus
09-03-2006, 14:36
generics (http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html)

NaNNy86
09-03-2006, 22:12
li abbiamo fatti prorpio oggi :D

non c'ho capito molto, ma ora mi devo dedicare alla parte grafica... :bsod:

rdefalco
09-03-2006, 23:17
generics

Beh sembrano interessanti, perlomeno riguardo la parte del compilare e rilevare errori prima della fase di runtime.

All'Università di Salerno non li hanno nemmeno nominati però :asd: sono una feature della 1.5.0?

NaNNy86
10-03-2006, 11:45
Sì, li hanno introdotti con la 1.5.0 ;)