Ciao a tutti, in un programma che devo implementare mi viene richiesto di leggere da un file una serie di preventivi, ognuno dei quali contiene i seguenti dati: progressivo delpreventivo, data, codice fiscale del richiedente, tasso di sconto applicato, lista di mobili, ciascuno accompagnato dalla tipologia (lusso, rustico, economico, ...), dalla quantità, e dal relativo prezzo, chiusa dal simbolo '#', in questo modo:


1
12/01/2005
VRDPLA87T65H456O
30
tavolo
lusso
1
5000.00
sedia
lusso
6
500.00
#
2
14/01/2005
RSSMRA56I98J314K
20
comodino
rustico
2
450.00
letto
rustico
1
2000.00
#
...
10
20/02/2005
VRDPLA87T65H456O
30
console
lusso
1
3500.00
#
.....


io ho implementato le seguenti classi:
CLASSE MOBILE
codice:
import java.io.PrintStream;import java.util.Scanner;


public class Mobile 
{
    private String tipo;
    private int quantita;
    private double prezzo;
    private String mobile;
    
    public Mobile(String mobile, String tipo, int quantita, double prezzo) 
    {
        this.tipo = tipo;
        this.quantita = quantita;
        this.prezzo = prezzo;
        this.mobile = mobile;
    }


    public String getMobile(){
        return mobile;
    }
    
    public String getTipo() {
        return tipo;
    }


    public int getQuantita() {
        return quantita;
    }


    public double getPrezzo() {
        return prezzo;
    }


    public void setPrezzo(double prezzo) {
        this.prezzo = prezzo;
    }
    
    public static Mobile read(Scanner s)
    {
        if(!s.hasNextLine())
            return null;
        String mobile = s.nextLine(); 
        
        if(!s.hasNextLine())
            return null;
        String tipo = s.nextLine();
        
        if(!s.hasNextLine())
            return null;
        int quantita = Integer.parseInt(s.nextLine());
        
        if(!s.hasNextLine())
            return null;
        double prezzo = Double.parseDouble(s.nextLine());
        
        return new Mobile(mobile, tipo,quantita,prezzo);
    }
    
    public void print(PrintStream ps) {
        ps.println(mobile);
        ps.println(tipo);
        ps.println(quantita);
        ps.println(prezzo);
    }
    
}
CLASSE CLIENTE
codice:
import java.io.PrintStream;import java.util.ArrayList;
import java.util.Scanner;




public class Cliente 
{
    private String cf;
    private String nome;
    private String cognome;
    private String indirizzo;
    private ArrayList<Preventivo> preventivi;
    
    public Cliente(String cf, String nome, String cognome, String indirizzo) 
    {
        this.cf = cf;
        this.nome = nome;
        this.cognome = cognome;
        this.indirizzo = indirizzo;
        preventivi = new ArrayList<Preventivo>();
    }


    public String getCf() {
        return cf;
    }


    public String getNome() {
        return nome;
    }


    public String getCognome() {
        return cognome;
    }


    public String getIndirizzo() {
        return indirizzo;
    }


    public ArrayList<Preventivo> getPreventivi() {
        return preventivi;
    }


    public void setPreventivi(ArrayList<Preventivo> preventivi) {
        this.preventivi = preventivi;
    }
    
    public void addPreventivo(Preventivo p)
    {
        preventivi.add(p);
    }
    
    public static Cliente read(Scanner in)
    {
        if(!in.hasNextLine())
            return null;
        String cf = in.nextLine();
        
        if(!in.hasNextLine())
            return null;
        String nome = in.nextLine();
        
        if(!in.hasNextLine())
            return null;
        String cognome = in.nextLine();
        
        if(!in.hasNextLine())
            return null;
        String indirizzo = in.nextLine();
        
        return new Cliente(cf,nome,cognome,indirizzo);
    }
    
    public void print(PrintStream ps)
    {
        ps.println(cf);
        ps.println(nome);
        ps.println(cognome);
        ps.println(indirizzo);
    }
}
CLASSE PREVENTIVO
codice:
import java.util.Date;import java.io.PrintStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Scanner;


public class Preventivo 
{
    private String id;
    private Date data;
    private String cf;
    private int sconto;
    private ArrayList<Mobile> mobili;
    private Cliente cliente;
    
    public Preventivo(String id, Date data, String cf, int sconto, ArrayList<Mobile> mobili) {
        super();
        this.id = id;
        this.data = data;
        this.cf = cf;
        this.sconto = sconto;
        this.mobili = mobili;
        cliente = null;
    }


    public String getId() {
        return id;
    }


    public Date getData() {
        return data;
    }


    public String getCf() {
        return cf;
    }


    public int getSconto() {
        return sconto;
    }


    public ArrayList<Mobile> getMobili() {
        return mobili;
    }


    public Cliente getCliente() {
        return cliente;
    }


    public void setSconto(int sconto) {
        this.sconto = sconto;
    }


    public void setMobili(ArrayList<Mobile> mobili) {
        this.mobili = mobili;
    }
    
    public void setCliente(Cliente cliente) {
        this.cliente = cliente ;
    }
    
    public void preventivoScontato()
    {
        ArrayList<Mobile> mobiliScontati = new ArrayList<Mobile>();
        for(Mobile m: mobili)
        {
            double prezzoScontato = ((m.getPrezzo()/100)*(100 - sconto));
            m.setPrezzo(prezzoScontato);
            mobiliScontati.add(m);
        }
        this.setMobili(mobiliScontati);
    }
    
    public static Preventivo read(Scanner s)
    {
        Date data;
        ArrayList<Mobile> mobili = new ArrayList<Mobile>();
        
        if(!s.hasNextLine())
            return null;
        String id = s.nextLine();
        
        SimpleDateFormat df = new SimpleDateFormat(Constants.FormatDate); 
        
        if(!s.hasNextLine())
            return null;
        try {
            data = df.parse(s.nextLine());
        } catch (ParseException e) {
            System.err.println("Un'eccezione è stata lanciata nella lettura del progetto " + id);
            System.err.println("Verrà assegnata di default la data odierna");
            data = new Date();
        }
        
        if(!s.hasNextLine())
            return null;
        String cf = s.nextLine();
        
        if(!s.hasNextLine())
            return null;
        int sconto = Integer.parseInt(s.nextLine());
        
        boolean done = true;
        if(!s.hasNextLine())
            return null;
        while(done){
            mobili.add(Mobile.read(s));
            if(s.nextLine().equals("#")) done = false;
            else done = true;
        }
        
        return new Preventivo(id,data,cf,sconto,mobili);
    }
    
    public void print(PrintStream ps) {
        SimpleDateFormat df = new SimpleDateFormat(Constants.FormatDate);


        ps.println(id);
        ps.println(df.format(data));
        ps.println(cf);
        ps.println(sconto);
        for(Mobile m: mobili)
            ps.println(m);
    }
    
    public void addMobile(Mobile m)
    {
        mobili.add(m);
    }
    
}
CLASSE ARCHIVIO
codice:
import java.io.PrintStream;import java.util.ArrayList;
import java.util.Scanner;


public class ArchivioPreventivi 
{
    private ArrayList<Preventivo> preventivi;
    private ArrayList<Cliente> clienti;


    public ArchivioPreventivi(Scanner sP, Scanner sC)
    {
        clienti = new ArrayList<Cliente>();
        while(sC.hasNextLine())
        {
            Cliente c1 = Cliente.read(sC);
            clienti.add(c1);
        }
        
        preventivi = new ArrayList<Preventivo>();
        Cliente c = null;
        while(sP.hasNextLine())
        {
            try{
                Preventivo p = Preventivo.read(sP);
                c = this.searchClienteByCodFiscale(p.getCf());
                
                p.setCliente(c);
                c.addPreventivo(p);
                
                preventivi.add(p);
            }catch(ClienteNotFoundException e)
            {
                System.err.println(e.getMessage());
                System.err.println("La connessione non verrà effettuata ");
            }
        }
    }
    
    private ArchivioPreventivi(ArrayList<Preventivo> preventivi, ArrayList<Cliente> clienti)
    {
        this.preventivi = preventivi;
        this.clienti = clienti;
    }
    
    public Cliente searchClienteByCodFiscale(String cf) throws ClienteNotFoundException
    {
        Cliente cliente = null;
        for(Cliente p: clienti)
            if(p.getCf().equals(cf))
                cliente = p;
        if(cliente == null)
            throw new ClienteNotFoundException("Cliente non trovato per il codice fiscale " + cf); 
        
        return cliente;
    }
    
    public ArrayList<Preventivo> searchPreventiviByNameSurnameCliente(String name, String surname)
    {
        ArrayList<Preventivo> preventiviCercati = new ArrayList<Preventivo>();
        for(Preventivo p: preventivi)
        {
            Cliente c = p.getCliente();
            if(c.getNome().equalsIgnoreCase(name) && c.getCognome().equalsIgnoreCase(surname)){
                p.preventivoScontato();
                preventiviCercati.add(p);
            }
        }
        return preventiviCercati;
    }
    
    public ArrayList<Preventivo> preventiviScontati()
    {
        ArrayList<Preventivo> preventiviScontati = new ArrayList<Preventivo>();
        for(Preventivo p: preventivi)
        {
            p.preventivoScontato();
            preventiviScontati.add(p);
        }
        return preventiviScontati;
    }
    
    public void print(PrintStream ps)
    {
        for(Preventivo p: preventivi)
            p.print(ps);
    }


}
Quando eseguo il programma di test, mi lancia un'eccezione di tipo NumberFormatException quando va a leggere i mobili. Non riesco a capire dove stia l'errore