[Java]: Dov'è l'errore?

Lionel2
Salve,

ho sviluppato la seguente traccia

https://docs.google.com/viewer?a=v&pid= ... gzM2Q2NDMx

nel seguente modo:

1. CLASSE CLIENTE

package Mobilificio;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * 
 */
public class Cliente {

    public Cliente(String codiceFiscale, String nome, String cognome, String indirizzo, String cittaResidenza) {
        this.codiceFiscale = codiceFiscale;
        this.nome = nome;
        this.cognome = cognome;
        this.indirizzo = indirizzo;
        this.cittaResidenza = cittaResidenza;
    }

    public String getCittaResidenza() {
        return cittaResidenza;
    }

    public String getCodiceFiscale() {
        return codiceFiscale;
    }

    public String getCognome() {
        return cognome;
    }

    public String getIndirizzo() {
        return indirizzo;
    }

    public String getNome() {
        return nome;
    }
    
    public void print(PrintStream ps) {
        ps.println(codiceFiscale);
        ps.println(nome);
        ps.println(cognome);
        ps.println(indirizzo);
        ps.println(cittaResidenza);
    }

    public static Cliente read(Scanner sc) throws IOException {
        if(!sc.hasNextLine()){
            return null;
        }
        String codiceFiscale = sc.nextLine();
        if(!sc.hasNextLine()){
            return null;
        }
        String nome = sc.nextLine();
        if(!sc.hasNextLine()){
            return null;
        }
        String cognome = sc.nextLine();
        if(!sc.hasNextLine()){
            return null;
        }
        String indirizzo = sc.nextLine();
        if(!sc.hasNextLine()){
            return null;
        }
        String cittaResidenza = sc.nextLine();
        return (new Cliente(codiceFiscale, nome, cognome, indirizzo, cittaResidenza));
    }
    
    @Override
    public String toString() {
        return (codiceFiscale + ", " + nome + ", " + cognome + ", " + indirizzo + ", " + cittaResidenza);
    }
    
    private String codiceFiscale;
    private String nome;
    private String cognome;
    private String indirizzo;
    private String cittaResidenza;
}


2. CLASSE PREVENTIVO


package Mobilificio;


import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author 
 */
public class Preventivo {

    public Preventivo(int identificativo, String data, String codiceFiscale, float sconto, ArrayList<Mobile> mobili) {
        this.identificativo = identificativo;
        this.data = data;
        this.codiceFiscale = codiceFiscale;
        this.sconto = sconto;
        this.mobili = mobili;
    }

    public String getCodiceFiscale() {
        return codiceFiscale;
    }

    public String getData() {
        return data;
    }

    public int getIdentificativo() {
        return identificativo;
    }

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

    public float getSconto() {
        return sconto;
    }

    public String toString() {
        return (identificativo + ", " + data + ", " + codiceFiscale + ", " + sconto + ", ...");
    }

    public float getPrezzo() {
        float prezzo = 0.0f;
        Mobile mobile;
        for (int i = 0; i < mobili.size(); i++) {
            mobile=((Mobile)mobili.get(i));
            prezzo += mobile.getQuantita()*mobile.getPrezzo();
        }
        return (prezzo);
    }

    public void print(PrintStream ps) {
        ps.println(identificativo);
        ps.println(data);
        ps.println(codiceFiscale);
        ps.println(sconto);
        for (int i = 0; i < mobili.size(); i++) {
            System.out.println(mobili.get(i));
        }
    }

    public static Preventivo read(Scanner sc) throws IOException{
                
        String identificativoS = sc.nextLine();
        if (identificativoS == null) {
            return (null);
        }
        String identificativo = identificativoS;
                        
        String data = sc.nextLine();
        if (data == null) {
            return (null);
        }
        
        String codiceFiscale = sc.nextLine();
        if (codiceFiscale == null) {
            return (null);
        }
        
                
        String scontoS = sc.nextLine();
        if (scontoS == null) {
            return (null);
        }
        String sconto = scontoS;
        
        
        ArrayList<Mobile> mobili = new ArrayList<Mobile>();
        
        Mobile mobile = Mobile.read(sc);
        while (mobile != null) {
            mobili.add(mobile);
            mobile = Mobile.read(sc);     
        }
        
        System.out.println("Debug: "+ mobili);
             
        
        
        if(!sc.nextLine().equals("#")){
            return null;
        }
 
        return (new Preventivo(Integer.parseInt(identificativo), data, codiceFiscale, Float.parseFloat(sconto), mobili));
    }
    
    private int identificativo;
    private String data;
    private String codiceFiscale;
    private float sconto;
    private ArrayList<Mobile> mobili;
}


3. CLASSE MOBILE
package Mobilificio;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

/**
 *
 * @author
 */
public class Mobile {

    private String nome;
    private String tipo;
    private int quantita;
    private float prezzo;

    public Mobile(String nome, String tipo, int quantita, float prezzo) {
        this.nome = nome;
        this.tipo = tipo;
        this.quantita = quantita;
        this.prezzo = prezzo;
    }

    public String getNome() {
        return nome;
    }

    public float getPrezzo() {
        return prezzo;
    }

    public int getQuantita() {
        return quantita;
    }

    public String getTipo() {
        return tipo;
    }

    public void print(PrintStream ps) {
        ps.println(nome);
        ps.println(tipo);
        ps.println(quantita);
        ps.println(prezzo);
    }

    public static Mobile read(Scanner sc) throws IOException {
        
        String nome = sc.nextLine();
        if (nome == null || nome.equals("#")) {
            return (null);
        }
   
        
        String tipo = sc.nextLine();
        if (tipo == null) {
            return (null);
        }
        
        
        String quantitaS = sc.nextLine();
        if (quantitaS == null) {
            return (null);
        }
        String quantita = quantitaS;
        
        
        String prezzoS = sc.nextLine();
        if (prezzoS == null) {
            return (null);
        }
        
        String prezzo = prezzoS;
        return (new Mobile(nome, tipo, Integer.parseInt(quantita), Float.parseFloat(prezzo)));
    }
    
    @Override
    public String toString() {
        return (nome + ", " + tipo + ", " + quantita + ", " + prezzo);
    }
}


4. CLASSE GESTIONE

package Mobilificio;

import java.io.FileReader;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author 
 */
public class Gestione {

    public Gestione(){
        clienti = new ArrayList<Cliente>();
        preventivi = new ArrayList<Preventivo>();
    }

    public void load(String clienteFileName, String preventiviFileName) throws IOException {
        FileReader fileR = new FileReader(clienteFileName);
        Scanner sc = new Scanner(fileR);
        
        Cliente cliente = Cliente.read(sc);
        while (cliente != null) {
            clienti.add(cliente);
            cliente = Cliente.read(sc);
        }
        fileR.close();
        
        fileR = new FileReader(preventiviFileName);
        sc = new Scanner(fileR);
        
        Preventivo preventivo = Preventivo.read(sc);
        while (preventivo != null) {
            preventivi.add(preventivo);
            preventivo = Preventivo.read(sc);
        }
        fileR.close();
    }

    public void printPreventivi(PrintStream ps) {
        Preventivo preventivo;
        for (int i = 0; i < preventivi.size(); i++) {
            preventivo = ((Preventivo) preventivi.get(i));
            ps.println(preventivo.getIdentificativo() + " " + preventivo.getPrezzo() + " " + preventivo.getPrezzo() * (1 - preventivo.getSconto() / 100));
        }

    }

    public Cliente getCliente(String nome, String cognome) {
        Cliente cliente;
        for (int i = 0; i < clienti.size(); i++) {
            cliente = ((Cliente) clienti.get(i));
            if (cliente.getNome().equals(nome) && cliente.getCognome().equals(cognome)) {
                return (cliente);
            }
        }
        return (null);
    }

    public void printPreventivi(PrintStream ps, String nome, String cognome) {
        Preventivo preventivo;
        Cliente cliente = getCliente(nome, cognome);
        if (cliente == null) {
            return;
        }
        float totale = 0.0f;
        for (int i = 0; i < preventivi.size(); i++) {
            preventivo = ((Preventivo) preventivi.get(i));
            if (preventivo.getCodiceFiscale().equals(cliente.getCodiceFiscale())) {
                totale += preventivo.getPrezzo() * (1 - preventivo.getSconto() / 100);
            }
        }
        ps.println("EURO " + totale);
    }
    
    private ArrayList<Cliente> clienti;
    private ArrayList<Preventivo> preventivi;
}


5. TESTER

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Mobilificio;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 
 */
public class Tester {
        public static void main(String[] argv){
        Gestione gestione = new Gestione();
        
        try {
            gestione.load("C:/Corso Java/SoluzioneEsame/NoCanfora/clienti.txt", "C:/Corso Java/SoluzioneEsame/NoCanfora/preventivi.txt" );    
            
        } catch (IOException ex) {
            Logger.getLogger(Tester.class.getName()).log(Level.SEVERE, null, ex);
        }       
        Cliente prova = gestione.getCliente("Mario", "Rossi");
        System.out.println(prova);
        
        gestione.printPreventivi(System.out);
        
        gestione.printPreventivi(System.out, "Paolo", "Verdi");
        
    }
}


Il problema nasce quando manco in esecuzione il programma. Dov'è L'errore e come lo correggo?

GRazie

Risposte
hamming_burst
"Lionel":

Il problema nasce quando manco in esecuzione il programma. Dov'è L'errore e come lo correggo?

Che errore, codice di errore,..., ti esce? Se non lo dici si fa ben poco.

Lionel2
Ho corretto il codice che ho postato e ora, sfruttando anche un semplice debug, sembrerebbe funzionare, l'unica cosa non funziona bene...in quanto non mi dà il risultato richiesto ma fornisce durante la sua esecuzione:

run:
Debug: [tavolo, lusso, 1, 5000.0, sedia, lusso, 6, 500.0]
RSSMRA56I98J314K, Mario, Rossi, via Roma, Benevento
EURO 0.0
BUILD SUCCESSFUL (total time: 0 seconds)


Provando a fare il debug mi sono accorto che "non entra" nei cicli dei metodi printPreventivo.
Attraverso un ennesimo metodo di debug, il programma mi stampa la lista dei clienti, ma non mi stampa la lista dei preventivi.
Quindi il problema credo sia nella classe Preventivo, però non riesco a individuarlo.

Altra domanda importante come ho sviluppato il programma è programmazione ad oggetti corretta o si può migliorare ancora?

Lionel2
Analizzando più a fondo, l'arrayList con i preventivi non viene riempito, ma non riesco a capire l'errore

scrittore1
"Lionel":

Altra domanda importante come ho sviluppato il programma è programmazione ad oggetti corretta o si può migliorare ancora?


Dal metodo print di Preventivo, togli il System.out.println ma stampa tutto usando il parametro ps.

In generale io non userei dei metodi print o read o load all'interno delle singole classi, se ci pensi, di solito un mobile o un preventivo non compiono le azioni di stamparsi da sole, ma c'è un altro oggetto stampante che si preoccupa di stampare ciò che gli viene passato. Analogamente per la fase di lettura da file.

Ti suggerirei di provare a utilizzare un altra classe che si occupi solo della stampa e/o della lettura da file, in cui nel costruttore gli dici dove andare a stampare e avrà dei metodi stampaMobile, stampaPreventivo o quel che ti serve. Analogamente nel caso di lettura.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.