Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 33
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347

    Aiuto gestione eccezioni in una classe

    abbiamo fatto da poco la classe fattoriale all'università, io ho provato a rifarla a casa ma per fare una cosa più completa volevo gestire qualche eccezione e cioè: l'inserimento di un numero negativo(e questo mi è riuscito) e l'inserimento di un numero decimale(ecco il problema)...
    io ho provato a fare cosi(anche se mi sono reso subito conto che ho fatto una stupidaggine XD):
    codice:
    import java.util.*;
    public class Fattoriale{
    	public static void main(String args[]){
    		Scanner read = new Scanner(System.in);
    		int n;
    		System.out.println("__CALCOLO DEL FATTORIALE__");
    		do{
    		System.out.println("Inserire un numero intero positivo");
    		n = read.nextInt();
    		}
    		while(n < 0 || n%2 != 0 || n%2 != 5);
    		int fattoriale=1;
    		for(int i=n; i >= 1; i--){
    			fattoriale = i * fattoriale;
    		}
    		System.out.println(n+"!=" + fattoriale);
    	}
    }
    poi avrei anche un'altra domanda ma la posto dopo!
    grazie

    EDIT: scusate ma ho il mouse che non funziona bene e fa sempre doppi click! forse per questo si sono creati 2 topic

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    La variabile "n" è dichiarata di tipo intero ed è corretto.
    Il metodo nextInt() di Scanner tenta di restituire il prossimo token come intero. Ed è ok.

    Tutto il lavoro per verificare che l'input dell'utente sia effettivamente un intero viene svolto già dalla classe Scanner che solleva un'eccezione (InputMismatchException) in caso l'utente digiti qualcosa che non sia effettivamente un intero.

    Detto questo, se usi Scanner in quel modo, l'unica cosa per "preoccuparti" che l'input sia corretto è gestire l'eccezione indicata con il blocco try/catch (non so se avete già affrontato questo argomento... se non lo avete visto, attenderei prima di addentrarmi in questo mondo).

    L'alternativa è usare nextLine() ed ottenere tutta la riga che l'utente ha digitato, per poi fare a mano i dovuti controlli e conversioni.

    Sinceramente, la condizione del do/while che hai scritto non ha alcun senso:

    codice:
    (n < 0 || n%2 != 0 || n%2 != 5)
    Con questa condizione il ciclo viene ripetuto se n < 0 (ok), oppure se n è dispari (perchè??)... l'ultima condizione non saprei nemmeno come esprimerla visto che è sempre rigorosamente vera (il resto della divisione per 2 non potrà mai essere 5... in generale, il resto della divisione per X sarà sempre rigorosamente minore di X... questo è un concetto matematico che dovrebbe essere ben chiaro, altrimenti andiamo a farfalle). Data l'ultima condizione senza senso, il ciclo viene ripetuto sempre e comunque.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    si sto chiedendo proprio questo infatti! fai finta che non esistano la seconda e la terza condizione del while (come ho detto nel primo post, ho scritto una stupidaggine!), come faccio a far ripetere la richiesta se l'utente inserisce un numero decimale? che condizione dovrei mettere al posto di "???" ?

    codice:
    import java.util.*;
    public class Fattoriale{
    	public static void main(String args[]){
    		Scanner read = new Scanner(System.in);
    		int n;
    		System.out.println("__CALCOLO DEL FATTORIALE__");
    		do{
    		System.out.println("Inserire un numero intero positivo");
    		n = read.nextInt();
    		}
    		while(n < 0 || ???);
    		int fattoriale=1;
    		for(int i=n; i >= 1; i--){
    			fattoriale = i * fattoriale;
    		}
    		System.out.println(n+"!=" + fattoriale);
    	}
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da John360
    come faccio a far ripetere la richiesta se l'utente inserisce un numero decimale?
    Ti suggerisco di creare un altro metodo che restituisce un int e al suo interno cicla "finché non è inserito un intero". In sostanza se il nextInt restituisce il int, lo restituisci dal metodo uscendo dal ciclo, se lancia InputMismatchException, ripeti il ciclo.
    Ma almeno così questa logica è incapsulata a parte dalla logica principale del tuo programmino.

    L'unica questione è il riferimento allo scanner, se il metodo lo fai static, passa lo Scanner. Altrimenti ti conviene pensare "ad oggetti" e usare metodi di istanza e istanziare un oggetto Fattoriale.

    P.S. e occhio a una cosa: se un nextInt (o altri simili) di Scanner lancia InputMismatchException, il token errato non viene rimosso, devi estrarlo in altro modo (es. next() ) per buttarlo via.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    Originariamente inviato da andbin
    Ti suggerisco di creare un altro metodo che restituisce un int e al suo interno cicla "finché non è inserito un intero". In sostanza se il nextInt restituisce il int, lo restituisci dal metodo uscendo dal ciclo, se lancia InputMismatchException, ripeti il ciclo.
    Ma almeno così questa logica è incapsulata a parte dalla logica principale del tuo programmino.

    L'unica questione è il riferimento allo scanner, se il metodo lo fai static, passa lo Scanner. Altrimenti ti conviene pensare "ad oggetti" e usare metodi di istanza e istanziare un oggetto Fattoriale.

    P.S. e occhio a una cosa: se un nextInt (o altri simili) di Scanner lancia InputMismatchException, il token errato non viene rimosso, devi estrarlo in altro modo (es. next() ) per buttarlo via.
    @Andbin ti spiego la situazione... ho cominciato da poco a fare fondamenti di informatica all'università... siamo arrivati appena ad un accenno dei cicli e della condizionale... scusami ma di quello che hai scritto non ho capito proprio niente! Non ti sto assolutamente facendo una critica, anzi sono io ancora piuttosto ignorante in materia e quindi non c'ho capito niente... potresti spiegarti in parole veramente elementari?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da John360
    scusami ma di quello che hai scritto non ho capito proprio niente!
    potresti spiegarti in parole veramente elementari?
    Ok. Il mio consiglio era quello di fare un metodo es.:

    codice:
    public static int leggiIntero(Scanner scanner) {
        ....
    }
    All'interno del metodo ci deve essere un ciclo. Ad ogni richiesta puoi stampare in output un "prompt" che dica "Inserire un intero: " o cose del genere.

    Ci sono comunque diversi approcci:
    1) invocare direttamente nextInt() e se lancia una eccezione InputMismatchException a) butti via il token e b) ripeti il ciclo
    oppure
    2) sfruttare hasNextInt() e se dà false a) butti via il token e b) ripeti il ciclo.

    Insomma in un caso controlli l'eccezione, nell'altro se è lo scanner a dirti se l'intero c'è.

    Ragionaci un po' e prova a scrivere qualcosa, se hai dubbi, chiedi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    scusa ma queste cose ancora non le abbiamo fatte... non ho la minima idea di come si faccia a controllare se dia un'eccezione InputMismatchException, ne di cosa sia hasnextInt... siamo ancora fermi alla creazione di una classe principale. Non abbiamo fatto niente altro, neanche creazione di metodi da collegare...

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Originariamente inviato da John360
    scusa ma queste cose ancora non le abbiamo fatte... non ho la minima idea di come si faccia a controllare se dia un'eccezione InputMismatchException, ne di cosa sia hasnextInt... siamo ancora fermi alla creazione di una classe principale. Non abbiamo fatto niente altro, neanche creazione di metodi da collegare...
    Allora dovresti avere pazienza e aspettare di vederle... il forum non è sostitutivo del corso che già stai seguendo. Se le tue conoscenze non ti permettono di affrontare determinati argomenti, o te li studi o aspetti che il corso prosegua.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    347
    quindi non c'è nessun'altro modo più semplice per "evitare" che l'utente inserisca un numero decimale?

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,306
    Originariamente inviato da John360
    quindi non c'è nessun'altro modo più semplice per "evitare" che l'utente inserisca un numero decimale?
    Le modalità ti sono state date... non è questione di "semplice" o meno. E' questione di saper usare gli strumenti (classe Scanner, che fa tutto lei) ed il linguaggio (trattamento delle eccezioni). Tutti argomenti che ti verranno spiegati più avanti durante il corso.

    Tra parentesi, non mi pare sia "complicato" utilizzare il metodo "hasNextInt()" per verificare se l'utente ha inserito un intero o meno... è un metodo che restituisce un booleano (true/false) a seconda se l'utente ha inserito un intero oppure no... chiaro che, nel caso non abbia inserito un intero, l'eventualità va trattata: scarto dell'attuale input e richiesta di un nuovo input.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.