Errore java.lang.NullPointerException!!!

di il
15 risposte

Errore java.lang.NullPointerException!!!

Ciao a tutti,

questo è il mio metodo:

// esercizio 4
	public void eroga(String codiceBevanda, int tessera) throws CreditoInsufficiente, BevandaEsaurita {

		int qta = 1;
		boolean verifica = false;
		Colonna colonnaBevanda = getColonnaPerBevanda(codiceBevanda);
		Tessera tesseraCredito = getCodiceTessera(tessera);
		double creditoTessera = tesseraCredito.getCredito();

		// se il credito è insufficiente e la quantità è <= 0 fai l'eccezione
		if (creditoTessera <= 0)
			throw new CreditoInsufficiente();
		else if (colonnaBevanda.getQuantita() <= 0)
			throw new BevandaEsaurita();
		else {
			System.out.println("Nessuna richiesta insoddisfatto!!!");
		}

		if (codiceBevanda != null && tesseraCredito != null && creditoTessera > 0) {
			// decrementa la lattina di 1
			colonnaBevanda.setQuantita(colonnaBevanda.getQuantita() - qta);
			// decrementa il saldo totale
			// Fai la sottrazione e dammi il totale
			tesseraCredito.setCredito(tesseraCredito.getCredito() - colonnaBevanda.getBevanda().getPrezzo()); 
			System.out.println("Codice: " + codiceBevanda + " Tessera: " + tessera + "Quantità: " + colonnaBevanda.getQuantita() + "Credito:" + tesseraCredito.getCredito());
			verifica = true;
		} else
			System.out.println("Nessuna dei fattori è vera");
	}


l'errore me l'ho da qui:
double creditoTessera = tesseraCredito.getCredito();

questa è la mia classe Tessera:

public class Tessera {
	
	private int codice;
	private double credito;
	
	public Tessera(int codice, double credito) {
		this.codice = codice;
		this.credito = credito;
	}
	
	public Tessera() {}

	public int getCodice() {
		return codice;
	}

	public void setCodice(int codice) {
		this.codice = codice;
	}

	public double getCredito() {
		return credito;
	}

	public void setCredito(double credito) {
		this.credito = credito;
	}
	
	public String toString() {
		return "saldo totale: " + this.getCredito();
	}
	
	
	

}
questa è la classe aggiorna Credito:

public class AggiornaCredito {

	private HashMap<Integer, Tessera> mHashMap;

	public AggiornaCredito(HashMap<Integer, Tessera> mHashMap) {
		this.mHashMap = mHashMap;
	}

	public AggiornaCredito() {
	}

	public HashMap<Integer, Tessera> getmHashMap() {
		return mHashMap;
	}

	public void setmHashMap(HashMap<Integer, Tessera> mHashMap) {
		this.mHashMap = mHashMap;
	}

	// carica Tessera
	public void caricaTessera(int codice, double credito) throws TesseraNonValida {
		Tessera t = mHashMap.get(codice);
		double somma = 0;

		if (t != null) {
//			t.setCredito(credito); // set
			somma = somma + credito + t.getCredito(); //aggiorna credito
			t.setCredito(somma); //aggiorna credit
			mHashMap.put(t.getCodice(), t); // aggiungi nella mappa
		} else
			throw new TesseraNonValida();
	}

	// leggi credito
	public void leggiCredito(int codice) {
		Tessera tessera = mHashMap.get(codice);

		if (true) {
			System.out.println("Il credito: " + mHashMap.get(tessera).getCredito());
		} else
			System.out.println("Il credito non è presente nella lista");
	}
}


In pratica questo esercizio consiste nel seguente modo:
1) se il credito e le bevande sono insufficienti invia un eccezione
2)se la bevanda esiste la quantità delle bevande deve decrementare di 1
3)il totale del credito deve decrementare in base al prezzo della bevanda
4)stampo

Che cosa ho sbagliato???
I

15 Risposte

  • Re: Errore java.lang.NullPointerException!!!

    robot ha scritto:


    l'errore me l'ho da qui:
    double creditoTessera = tesseraCredito.getCredito();
    Allora tesseraCredito è sicuramente null.
    Cosa fa getCodiceTessera(int) ?? PUO' restituire null? Se sì, lo devi considerare. Difatti più sotto fai un tesseraCredito != null
  • Re: Errore java.lang.NullPointerException!!!

    Fa questo:

    In pratica verifica se esiste il codice
    
    // Cicla è verifica il codice della Tessera
    	public Tessera getCodiceTessera(int codiceTessera) {
    		for (Tessera tessera : tesseras) {
    			if (codiceTessera == tessera.getCodice())
    				return tessera;
    		}
    		return null;
    	}
    
    
  • Re: Errore java.lang.NullPointerException!!!

    robot ha scritto:


    In pratica verifica se esiste il codice
    Appunto, può non trovare il codiceTessera. Cosa intendi fare in quel caso? eroga() deve poter continuare o fallire subito?
  • Re: Errore java.lang.NullPointerException!!!

    In pratica quando inserisco il codice bevanda e il codice tessera, il metodo decrementa di 1 le bevande in base alla quantità e calcola il credito in base al prezzo che è stato fornito dal codice tessera.
    e infine deve stampare.

    quando ho fatto il debag mi ha trovato due valori null, che sono:

    Tessera tesseraCredito = getCodiceTessera(tessera); //null
    double creditoTessera = tesseraCredito.getCredito(); //null


    questo è il mio main:
    
    public class TestDistributore {
    
    	public static void main(String[] args) {
    		Scanner in = new Scanner(System.in);
    		String scriviCodiceBevanda = "";
    		int scriviCodiceTessera = 0;
    		
    		// Esercizio 1
    		// Riempiere la tabella con le Mappe BEVANDE
    		System.out.println("CATEGORIA BEVANDE");
    		HashMap<String, Bevande> map1 = new HashMap<>();
    
    		Bevande bevanda1 = new Bevande("a", null, "acqua", 0.20);
    		Bevande bevanda2 = new Bevande("b", null, "coca", 0.30);
    		Bevande bevanda3 = new Bevande("c", null, "birra", 1.00);
    		Bevande bevanda4 = new Bevande("d", null, "sapone", 3.00);
    
    		// Aggiungi nella Mappa
    		map1.put(bevanda1.getCodice(), bevanda1);
    		map1.put(bevanda2.getCodice(), bevanda2);
    		map1.put(bevanda3.getCodice(), bevanda3);
    		map1.put(bevanda4.getCodice(), bevanda4);
    
    		// Chiama il metodo aggiungi bevanda che ha una descrizione
    		Distributore distributore = new Distributore(map1);
    		try {
    			distributore.aggiungiBevanda("a", "questa bottiglia contiene l'acqua");
    			distributore.aggiungiBevanda("b", "questa bottiglia contiene la coca-cola");
    			distributore.aggiungiBevanda("c", "questa bottiglia contiene la birra");
    			distributore.aggiungiBevanda("d", "questo sapone è profumato");
    			// distributore.aggiungiBevanda("d", "questa bottiglia non esiste"); //gestione
    			// errori
    		} catch (BevandaNonValida e) {
    			e.printStackTrace(); // chiama il mio metodo presonalizzato
    		}
    
    		// iterare mappa per mostrare il contenuto CHIAVE e VALORE
    		Iterator iterator = map1.entrySet().iterator();
    
    		while (iterator.hasNext()) {
    			Map.Entry pEntry = (Entry) iterator.next();
    			System.out.println(pEntry.getKey().toString()); // stampa tutte le chiavi
    			System.out.println(pEntry.getValue()); // stampa tutti i valori
    			System.out.println(((Bevande) pEntry.getValue()).getDescrizione()); // stampa descrizione
    			System.out.println("------------------------------------------");
    		}
    
    		// Esercizio 2
    		System.out.println("CATEGORIA TESSERE");
    		Tessera t1 = new Tessera(12, 5.5);
    		Tessera t2 = new Tessera(21, 10.0);
    		Tessera t3 = new Tessera(99, 0.75);
    		Tessera t4 = new Tessera(15, 9.75);
    
    		// riempi le tabelle tessere con le mappe
    		HashMap<Integer, Tessera> mTessera = new HashMap<>();
    		mTessera.put(t1.getCodice(), t1);
    		mTessera.put(t2.getCodice(), t2);
    		mTessera.put(t3.getCodice(), t3);
    		mTessera.put(t4.getCodice(), t4);
    
    		// chiama il metodo carica tessera
    		AggiornaCredito aCredito = new AggiornaCredito(mTessera);
    		try {
    			aCredito.caricaTessera(12, 300.4); // aggiorna il SALDO
    			aCredito.caricaTessera(21, 250.8);
    			
    			//caricato ben due volte il credito della tessera
    			aCredito.caricaTessera(99, 60.0);
    			aCredito.caricaTessera(99, 50.0);
    			
    			aCredito.caricaTessera(15, 100.0);
    		} catch (TesseraNonValida e) {
    			e.printStackTrace();
    		}
    
    		// Mostra il saldo totale tramite la chiave
    		Iterator iteratoreTessera = mTessera.entrySet().iterator();
    
    		while (iteratoreTessera.hasNext()) {
    			Map.Entry mEntry = (Entry) iteratoreTessera.next();
    			System.out.println("La chiave: " + mEntry.getKey());
    			System.out.println(mEntry.getValue().toString()); // saldo totale
    		}
    
    		// Esercizio 3
    		System.out.println();
    		System.out.println("AGGIORNA COLONNA DISTRIBUTORE");
    		int codiceA, codiceB, codiceC, codiceD;
    
    		// codice A
    		distributore.aggiornaColonna("a", 40);
    
    		// codice A --> ripeto di nuovo per verificare se fa la somma
    		distributore.aggiornaColonna("a", 20); // totale lattine = 60
    
    		codiceA = distributore.lattineDisponibili("a");
    
    		// codice B
    		distributore.aggiornaColonna("b", 100);
    
    		distributore.aggiornaColonna("b", 50); // totale lattine = 150
    
    		codiceB = distributore.lattineDisponibili("b");
    
    		// codice C
    		distributore.aggiornaColonna("c", 20);
    		distributore.aggiornaColonna("c", 210);
    		distributore.aggiornaColonna("c", 210);
    		
    		codiceC = distributore.lattineDisponibili("c");
    
    		// codiceD
    		distributore.aggiornaColonna("d", 30);
    
    		codiceD = distributore.lattineDisponibili("d");
    		
    		System.out.println(distributore);
    
    		// ESERCIZIO 4
    		System.out.println("***EROGA***");
    		System.out.println("Inserisci il codice della bevanda: ");
    		scriviCodiceBevanda = in.nextLine();
    		System.out.println("Inserisci il codice della tessera: ");
    		scriviCodiceTessera = in.nextInt();
    		
    		try {
    			distributore.eroga(scriviCodiceBevanda, scriviCodiceTessera);
    		} catch (CreditoInsufficiente | BevandaEsaurita e) {
    			e.printStackTrace();
    		}
    
    	}
    
    
  • Re: Errore java.lang.NullPointerException!!!

    Questa è la classe distributore:
    
    public class Distributore {
    
    	private HashMap<String, Bevande> lMap;
    	private List<Colonna> colonnas = new ArrayList<>();
    	private List<Tessera> tesseras = new ArrayList<>();
    
    	public Distributore(HashMap<String, Bevande> lMap) {
    		this.lMap = lMap;
    	}
    
    	public HashMap<String, Bevande> getlMap() {
    		return lMap;
    	}
    
    	public void setlMap(HashMap<String, Bevande> lMap) {
    		this.lMap = lMap;
    	}
    
    	// Aggiungi descrizione di una bevanda -->TESSERA
    	public void aggiungiBevanda(String codice, String descrizione) throws BevandaNonValida {
    
    		Bevande b = lMap.get(codice); // trova il codice
    
    		if (b != null) {// se nella mappa contiene il codice chiave
    			b.setDescrizione(descrizione); // aggiungi una descrizione
    			lMap.put(codice, b); // aggiungi nella mappa
    		} else
    			throw new BevandaNonValida();
    	}
    
    	public void aggiornaColonna(String codBevanda, int qta) {
    		if (codBevanda == null) {
    			System.out.println("Nessun codice!!!");
    		}
    
    		Colonna colonna = getColonnaPerBevanda(codBevanda); // codice trovato
    
    		if (colonna != null) { // se esiste
    			// Colonna trovata: aggiunge solo quantità
    			colonna.setQuantita(colonna.getQuantita() + qta); // fai la somma
    		} else if (colonnas.size() <= 4) {
    			// Colonna NON trovata E c'è ancora posto: aggiunge nuova Colonna
    			colonnas.add(new Colonna(qta, lMap.get(codBevanda)));
    		}
    	}
    
    	// Cicla è verifica il codice della Bevanda
    	public Colonna getColonnaPerBevanda(String codBevanda) {
    		for (Colonna colonna : colonnas) {
    			if (codBevanda.equals(colonna.getBevanda().getCodice())) {
    				return colonna;
    			}
    		}
    		return null;
    	}
    
    	// Cicla è verifica il codice della Tessera
    	public Tessera getCodiceTessera(int codiceTessera) {
    		for (Tessera tessera : tesseras) {
    			if (codiceTessera == tessera.getCodice())
    				return tessera;
    		}
    		return null;
    	}
    
    	public int lattineDisponibili(String codice) {
    		int totale = 0;
    		Colonna colonna = getColonnaPerBevanda(codice);
    
    		if (colonna != null) {
    			System.out.println("------------------------------------");
    			totale = colonna.getQuantita();
    			System.out.println("codice: " + codice + " Lattine disponibili: " + totale);
    		}
    
    		return totale;
    	}
    
    	// esercizio 4
    	public void eroga(String codiceBevanda, int tessera) throws CreditoInsufficiente, BevandaEsaurita {
    
    		int qta = 1;
    		boolean verifica = false;
    		Colonna colonnaBevanda = getColonnaPerBevanda(codiceBevanda);
    		Tessera tesseraCredito = getCodiceTessera(tessera); //null
    		double creditoTessera = tesseraCredito.getCredito(); //null
    
    		// se il credito è insufficiente e la quantità è <= 0 fai l'eccezione
    		if (creditoTessera <= 0)
    			throw new CreditoInsufficiente();
    		else if (colonnaBevanda.getQuantita() <= 0)
    			throw new BevandaEsaurita();
    		else {
    			System.out.println("Nessuna richiesta insoddisfatto!!!");
    		}
    
    		if (codiceBevanda != null && tesseraCredito != null && creditoTessera > 0) {
    			// decrementa la lattina di 1
    			colonnaBevanda.setQuantita(colonnaBevanda.getQuantita() - qta);
    			// decrementa il saldo totale
    			// Fai la sottrazione e dammi il totale
    			tesseraCredito.setCredito(tesseraCredito.getCredito() - colonnaBevanda.getBevanda().getPrezzo()); 
    			System.out.println("Codice: " + codiceBevanda + " Tessera: " + tessera + "Quantità: " + colonnaBevanda.getQuantita() + "Credito:" + tesseraCredito.getCredito());
    			verifica = true;
    		} else
    			System.out.println("Nessuna dei fattori è vera");
    	}
    
    	// stampa la lista
    	public String toString() {
    		StringBuilder stampa = new StringBuilder();
    
    		System.out.println();
    
    		for (int i = 0; i < colonnas.size(); i++) {
    			stampa.append(" indice: ").append(i);
    			stampa.append(" Codice: ").append(colonnas.get(i).getBevanda().getCodice());
    			stampa.append(" Quantità: ").append(colonnas.get(i).getQuantita());
    			stampa.append("\n");
    		}
    
    		return stampa.toString();
    	}
    
    }
    
  • Re: Errore java.lang.NullPointerException!!!

    robot ha scritto:


    Questa è la classe distributore:
    Nella tua classe Distributore hai messo il campo

    private List<Tessera> tesseras = new ArrayList<>();

    Ok, ma NON c'è alcun punto in cui viene aggiunto o reso possibile aggiungerci qualcosa.

    Il punto, lo dico ma non per criticare, è che tutto quanto andava fatto con un design un po' diverso e migliore.
    Poi ovviamente non posso sapere ora se ti sono stati dati requisiti ben precisi o no.
  • Re: Errore java.lang.NullPointerException!!!

    In pratica mi permette scorrere la lista della classe tessera per verificare se il codice esiste. percio ho messo nella lista.
    indentica cosa come le bevande.

    Come mai mi da il valore null??
    come si può risolvere?
  • Re: Errore java.lang.NullPointerException!!!

    robot ha scritto:


    Come mai mi da il valore null??
    come si può risolvere?
    Ma l'ho detto prima. In quella lista tesseras non viene aggiunto nulla!

    Guarda bene nella classe Distributore DOVE viene usato il campo tesseras .
  • Re: Errore java.lang.NullPointerException!!!

    L'ho usato per ottenere il codice tessera restituendo l'oggetto tessera, ma mi da null, come posso assegnare per farmi restituire il codice tessera il codice che ho scritto te l'ho fatto vedere. Ma non riesco a risolvere
  • Re: Errore java.lang.NullPointerException!!!

    Public Tessera getCodiceTessera(int codiceTessera) {
    for (Tessera tessera : tesseras) {
    if (codiceTessera == tessera.getCodice())
    return tessera;
    }
    return null;
    }
  • Re: Errore java.lang.NullPointerException!!!

    Nella classe aggiornacredito tessera è un hashmap penso che questo è il problema è mi ritorna null,
    Visto che io ho fatto una lista.
    Come si può risolvere??
  • Re: Errore java.lang.NullPointerException!!!

    C'è qualcuno che mi può aiutare??
  • Re: Errore java.lang.NullPointerException!!!

    HO RISOLTO TUTTO OK.
    GRAZIE A TUTTI
  • Re: Errore java.lang.NullPointerException!!!

    Ho lo stesso errore e non capsco perché...
    Questo è il codice

    
            if (!jTextField2.getText().trim().equals(array[1].trim())) {
                System.out.println(jTextField2.getText());
                System.out.println(array[1]);
                System.out.println(array[0]);
                try {
                    con.prepareStatement("UPDATE tab_magazzino \n"
                            + "SET descrizione = '" + jTextField2.getText().trim()
                            + "' \nWHERE codice_prodotto = '" + array[0] + "';");
                    modificato = true;
                } catch (Exception e) {
                    jLabel2.setText("Campo obbligatorio");
                    System.out.println("descrizione " + e);
    
                }
            }
    
    Questo in rosso è quello che stampa
    desc modificata e questo dovrebbe andare bene...
    x7yfme4xt7z7btuQuesto è quello che c'è nella descrizione e dovrebbe andare bene...
    00hyck3j7jaflh6Questo è il codice_prodotto e dovrebbe andare bene...
    descrizione java.lang.NullPointerException

    jTextField2 è dove inserisco la descrizione. Il codice sopra viene raggiunto quando premo un bottone.
Devi accedere o registrarti per scrivere nel forum
15 risposte