PDA

Visualizza la versione completa : [JAVA] problema in lettura da file.....


rossonero922
19-07-2013, 00:40
ho questo file:

01/01/2013
Avellino
5
14
Benevento
3
13
Caserta
4
15
Napoli
7
16
Salerno
10
15
02/01/2013
Avellino
5
13
Benevento
4
11
Caserta
4
16
Napoli
7
9
Salerno
6

devo leggerlo ....ho fatto questo metodo di lettura


public static Città read(Scanner s)
{

DateFormat df= new SimpleDateFormat("dd/MM/yyyy");
Date d=null;
String Sd;
if(!s.hasNextLine())
return null;
Sd=s.nextLine();
try {
d=(Date)df.parse(Sd);
} catch (ParseException e) {
e.printStackTrace();
}
String n;
if(!s.hasNextLine())
return null;
n=s.nextLine();
String Smn;
if(!s.hasNextLine())
return null;
Smn=s.nextLine();
int mn=Integer.parseInt(Smn);
String Smx;
if(!s.hasNextLine())
return null;
Smx=s.nextLine();
int mx=Integer.parseInt(Smx);
return new Città(d,n,mn,mx);


}

mi da errore...per quello che ho capito l errore sta nel fatto che mi legge la data anche quando non deve cioè rifacendoci al file mi legge la prima volta

01/01/2013
Avellino
5
14
mentre la seconda volta mi legge
Benevento
3
13
in questo secondo caso mi da errore perche tenta di castare benevento in data...come risolvo???

andbin
19-07-2013, 08:55
Originariamente inviato da rossonero922
in questo secondo caso mi da errore perche tenta di castare benevento in data...come risolvo??? In diversi modi:
- o tratti tutto quanto c'è tra una data e l'ultima info prima della successiva data come un "record" e quindi fornirai un oggetto che ha una data e una lista di città. (uhm, vedo adesso che Città ha la data, quindi in effetti non è sensato)
- oppure gestisci un po' di logica per fare la lettura/parse della data solo ogni tot che sai tu.

Alcuni consigli (ascoltali):
- per ParseException non fare solo un ParseException, cioè questo va bene ma se la data fosse malformata comunque continuare con il resto non avrebbe senso, quindi fai uscire o ParseException o una tua eccezione di significato più appropriato.
- dai nomi sensati alle variabili ... non Sd, d, n
- ho la sensazione che quel read statico l'hai messo in una classe in mezzo a un sacco di altra roba, valuta di gestire la sola lettura da file in una classe separata e apposita ... e non con metodi statici!

Alex'87
19-07-2013, 09:29
Aggiungo: non usare lettere accentate nei nomi delle classi, se il file viene aperto con una codifica diversa viene fuori un porcaio ;)

rossonero922
19-07-2013, 12:20
non ne vengo a capo.....avevo pensato di controllare se quella è una data,se lo è legge altrimenti salta e va alla lettura successiva...ma non riesco a implementare

andbin
19-07-2013, 14:41
Originariamente inviato da rossonero922
non ne vengo a capo.....avevo pensato di controllare se quella è una data,se lo è legge altrimenti salta e va alla lettura successiva...ma non riesco a implementare Se la data si presenta nel file con una cadenza esatta, ad esempio sempre ogni 5 città, è facile, tieni un "contatore" delle città. A 0 sai che devi leggere la data. Alla quinta città riazzeri e per la successiva città sai di nuovo di dover leggere la data.

Se la data non ha cadenza fissa/nota .... è più un problema ma in teoria risolvibile.


P.S. prima quando dicevo "per ParseException non fare solo un ParseException" volevo scrivere "per ParseException non fare solo un printStackTrace".

rossonero922
20-07-2013, 10:19
mmm quindi potrei usare un while se ho capito bene.....comunque grazie per i consigli ora che hai spiegato che parlavi dell printStackTrace() ho capito che intendevi......XD

rossonero922
20-07-2013, 10:43
ho fatto cosi:


public static Città raed(Scanner s)
{
DateFormat df= new SimpleDateFormat("dd/MM/yyyy");

String Sd,n ,Smn,Smx;
int mx ,mn;
Date d = null;

if(contatore==0)
{
if(!s.hasNextLine())
return null;
Sd=s.nextLine();

try {

d = df.parse(Sd);

} catch (ParseException e) {

e.printStackTrace();
}

}


if(!s.hasNextLine())
return null;
n=s.nextLine();


if(!s.hasNextLine())
return null;
Smn=s.nextLine();
mn=Integer.parseInt(Smn);

if(!s.hasNextLine())
return null;
Smx=s.nextLine();
mx=Integer.parseInt(Smx);

contatore++;
if(contatore==5)contatore=0;


return new Città(d,n,mn,mx);


}

solo adesso mi da questo output
01/01/2013
Avellino
5
14
null
Benevento
3
13
null
Caserta
4
15
null
Napoli
7
16
null
Salerno
1
15
02/01/2013
Avellino
5
13
null
Benevento
4
11
null
Caserta
4
16
null
Napoli
7
9

cioè mi schiaffa quei null nella posizione della data...come dovrei farli sparire?

Loading