Problemi inzializzazione oggetto

di il
2 risposte

Problemi inzializzazione oggetto

Salve ragazzi , dopo un approfondimento sui testi ho provato a fare l'esercizio riguardante il BankAccount.
Volevo sapere perchè se scrivo il programma effettuando la registrazione di una persona prima di un menu che permetta di fare le operazioni elementari ( saldo prelievo e stampa) il programma funzioni , mentre se pongo un opzione nel menu che permette di registrare una persona mi da errore , cioè l'oggetto non risulta essere inizializzato.
Vi posto i due codici , funzionante e non :

Codice funzionante :

import java.util.*;

public class Prinicpale2{
public static void main(String[] args){

int scelta;
Scanner in = new Scanner(System.in);
Bankaccount account;
  System.out.println("Digitare nome:");
					  String nome = in.nextLine();
					  System.out.println("Digitare cognome:");
					  String cognome = in.nextLine();
					  System.out.println("Digitare data di nascita:");
					  System.out.println("Digitare giorno");
					  int giorno = in.nextInt();
					  System.out.println("Digitare mese:");
					  int mese = in.nextInt();
					  System.out.println("Digitare anno:");
					  int anno = in.nextInt();
  					  System.out.println("Digitare saldo iniziale:");
				          float saldo = in.nextFloat();
                                        account = new Bankaccount(nome,cognome,giorno,mese,anno,saldo);
do {
	System.out.println("\t\t\t Menu\n");
	System.out.println("\n1.Prelievo\n2.Deposito\n3.Stampa saldo\n0.Uscita");
	System.out.println("Digitare scelta:");
	scelta = in.nextInt();
        in.nextLine();

        	switch (scelta){ 
                                   case 1: 
						System.out.println("Digitare cifra da prelevare:");
						float prel = in.nextFloat();
							account.prelievo(prel);
                                                
					   break;
                                  case 2: 
					System.out.println("Digitare cifra da depositare:");
						float dep = in.nextFloat();
						account.deposito(dep);
                                                break;
				 case 3: 
						account.stampa();
                                                break;
			}
		}while(scelta!=0 && scelta<=4);

}}

Codice non funzionante :

import java.util.*;

public class Principale{
public static void main(String[] args){

int scelta;
Scanner in = new Scanner(System.in);
Bankaccount account;
do {
	System.out.println("\t\t\t Menu\n");
	System.out.println("1.Registra Persona\n2.Prelievo\n3.Deposito\n4.Stampa saldo\n0.Uscita");
	System.out.println("Digitare scelta:");
	scelta = in.nextInt();
        in.nextLine();
        	switch (scelta){
				 case 1 : 
					  System.out.println("Digitare nome:");
					  String nome = in.nextLine();
					  System.out.println("Digitare cognome:");
					  String cognome = in.nextLine();
					  System.out.println("Digitare data di nascita:");
					  System.out.println("Digitare giorno");
					  int giorno = in.nextInt();
					  System.out.println("Digitare mese:");
					  int mese = in.nextInt();
					  System.out.println("Digitare anno:");
					  int anno = in.nextInt();
  					  System.out.println("Digitare saldo iniziale:");
				          float saldo = in.nextFloat();
                                        account = new Bankaccount(nome,cognome,giorno,mese,anno,saldo);
					  break;
                                   case 2: 
						System.out.println("Digitare cifra da prelevare:");
						float prel = in.nextFloat();
							account.prelievo(prel);
                                                
					   break;
                                  case 3: 
						System.out.println("Digitare cifra da depositare:");
						float dep = in.nextFloat();
						account.deposito(dep);
                                                break;
				 case 4: 
						account.stampa();
                                                break;
			}
		}while(scelta!=0 && scelta<=4);

}}

classe dalla quale per entrambi creo gli oggetti account :

public class Bankaccount{

private String nome,cognome;
private int giorno , mese , anno;
private float saldo;

public Bankaccount(String nome,String cognome,int giorno , int mese , int anno , float saldo){

this.setpersona(nome,cognome,giorno,mese,anno,saldo);
}

public void setpersona(String nome,String cognome,int giorno,int mese,int anno,float saldo){
this.nome=nome;
this.cognome=cognome;
this.giorno=giorno;
this.mese=mese;
this.anno=anno;
this.saldo=saldo;
}

public void prelievo(float prel){
if(prel>saldo){
  System.out.println("Impossibile prelevare !!!!\n\n");
}else{

saldo = saldo-prel;
System.out.println("Nuovo saldo : " + saldo);
}}

public void deposito ( float dep){
saldo = saldo+dep;
System.out.println("Nuovo saldo : " + saldo);
}

public void  stampa(){

System.out.println("Cliente n°: ####### " + "\nNome: " + nome + "\tCognome: " + cognome );
System.out.println("Anno di nascita: " + giorno + "/" + mese + "/" + anno );
System.out.println("Saldo attuale: " + saldo);
}
}


2 Risposte

  • Re: Problemi inzializzazione oggetto

    cimmiv ha scritto:


    mentre se pongo un opzione nel menu che permette di registrare una persona mi da errore , cioè l'oggetto non risulta essere inizializzato.
    La variabile:

    Bankaccount account;

    è dichiarata nel main prima del grosso loop do-while ma non è appunto inizializzata subito.
    Poi nel case 1 vai ad assegnare un nuovo oggetto ad account.

    Il problema è negli altri punti dove usi account. Devi comprendere questo concetto: il compilatore NON "sa" (non può saperlo) quale sarà realmente il "flusso di esecuzione" del codice. Quindi non può sapere se davvero l'utente andrà a fare PRIMA il case 1 e poi gli altri case.
    L'unica cosa che il compilatore "sa" è che il flusso potrebbe essere tale per cui si può arrivare es. al case 2 o 3 o 4 con un account NON inizializzato. Ed è per questo che ottieni un errore del tipo "variable account might not have been initialized".

    E il discorso si può girare in un altro senso. Cosa VUOI che succeda se qualcuno cerca di usare i case 2/3/4 senza aver fatto prima il 1? Questo è un caso che DEVI considerare come situazione anomala.

    La soluzione comunque è semplice, all'inizio fai

    Bankaccount account = null;

    Così c'è sicuramente almeno un null. Poi nei case dove TI ASPETTI che ci sia un account valido, se trovi invece ancora null puoi segnalare il problema all'utente.
  • Re: Problemi inzializzazione oggetto

    Ti ringrazio tanto per la risposta , tutto chiaro adesso .
Devi accedere o registrarti per scrivere nel forum
2 risposte