Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [java] Problemi con NumberFormatException

    Ciao a tutti!!
    Sto tentando di introdurre i controlli per un FormatNumberException,ma il compiler mi tira fuori sempre questo errore:
    codice:
    myCalendar2.java:197: error: Syntax error, insert "Finally" to complete TryStatement
    	}
    	^
    1 problem (1 error)
    Posto qui sotto il codice che ho provato a compilare:
    codice:
        // la classe che definisce il ricevitore di eventi usato 
        // dal bottone Controllo data:
        class Receiver3 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    	String SGiorno = ggStart.getText ();
    	String SMese = mmStart.getText ();
    	String SAnno = yyStart.getText ();
    
    	 try {
    //Parsing:
    	int day=Integer.parseInt(SGiorno);
    	int month=Integer.parseInt(SMese);
    	int year=Integer.parseInt(SAnno);
    
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
    //Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
    // né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.
    		try {
    		cal.get (Calendar.DATE);
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");
    
    		} catch (IllegalArgumentException i) {
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    
    	} catch (NumberFormatException n) {
    		testoOutput.setText("Per eseguire il comando \"Controllo data\" \n accertarsi che i campi Giorno, Mese e Anni iniziale siano valorizzati con cifre da 0 a 9.");
    	  }
    	}
          }
        }
    Questo invece era il codice prima di introdurre il controllo per il NumberFormatException:
    codice:
        // la classe che definisce il ricevitore di eventi usato 
        // dal bottone Controllo data:
        class Receiver3 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    	String SGiorno = ggStart.getText ();
    	String SMese = mmStart.getText ();
    	String SAnno = yyStart.getText ();
    
    //Parsing:
    	int day=Integer.parseInt(SGiorno);
    	int month=Integer.parseInt(SMese);
    	int year=Integer.parseInt(SAnno);
    
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
    //Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
    // né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.
    		try {
    		cal.get (Calendar.DATE);
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");
    
    		} catch (IllegalArgumentException i) {
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	}
          }
        }
    Se qualcuno ne capisce più di me mi illumina?? Vi ringrazio!!!
    Gato

  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Il problema è nel "try" più esterno: non definisci nè un catch nè un finally, quindi di fatto è inutile e il compilatore te lo segnala

  3. #3
    Innanzitutto grazie per la risposta!!
    Ok,ma allora come posso fare a gestire tutti e due gli errori(NumbreFormatException e IllegalArgumentException)?
    Scusa so che magari per voi queste cose sono banali...
    Gato

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    Ok,ma allora come posso fare a gestire tutti e due gli errori(NumbreFormatException e IllegalArgumentException)?
    Tecnicamente per 1 try ci possono essere più catch "in fila". Con l'unica regola fondamentale che le eccezioni più "specifiche" vanno catturate prima di quelle più "generiche".

    Nel tuo caso però non vedo perché devi catturare anche IllegalArgumentException. I parseInt lanciano NumberFormatException e siccome l'input deriva da input "utente", allora sì, dovresti catturare e "dire" qualcosa all'utente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ti spiego subito,parto con il postare il codice:
    codice:
        // la classe che definisce il ricevitore di eventi usato 
        // dal bottone Controllo data:
        class Receiver3 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    	String SGiorno = ggStart.getText ();
    	String SMese = mmStart.getText ();
    	String SAnno = yyStart.getText ();
    
    	 try {
    //Parsing:
    	int day=Integer.parseInt(SGiorno);
    	int month=Integer.parseInt(SMese);
    	int year=Integer.parseInt(SAnno);
    
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
    //Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
    // né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.
    //		try {
    		cal.get (Calendar.DATE);
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");
    
    //		} catch (IllegalArgumentException i) {
    //		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    
    	} catch (NumberFormatException n) {
    		testoOutput.setText("Per eseguire il comando \"Controllo data\" \n accertarsi che i campi Giorno, Mese e Anni iniziale siano valorizzati con cifre da 0 a 9.");
    	  }
    	}
          }
        }
    In questo modo, essendo una data, se io do un input con una data errata (per assurdo 12/18/1986) viene lanciato in IllegalArgumentException, ma l'output non cambia (rimane scritto "Inserire dati").
    Sbaglio qualcosa nel mioragionamento?
    Gato

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    In questo modo, essendo una data, se io do un input con una data errata (per assurdo 12/18/1986) viene lanciato in IllegalArgumentException
    Sì in effetti mi sono ricordato ora (e l'avevo anche postato in una vecchia discussione!). Se non-lenient fare un get ad esempio del campo DATE può essere usato per "validare" la data che se non corretta/esistente fa lanciare IllegalArgumentException.

    Quindi per riassumere, hai 2 cause di eccezioni: NumberFormatException per i parseInt e IllegalArgumentException per la get.

    NumberFormatException è-un IllegalArgumentException, quindi più specifico. Ti basta usare 1 solo try + 2 catch in fila (e NumberFormatException prima perché più specifico!):

    codice:
    try {
        ... i parseInt ...
    
        GregorianCalendar cal = .....
        ....
        cal.get(Calendar.DATE);
        ...
    } catch (NumberFormatException e) {
        // qui è per via dell'input errato nei campi
    } catch (IllegalArgumentException e) {
        // qui è per ciò che resta, ovvero data non corretta/esistente
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Grazie andbin!!
    Ecco, ho provato così:
    codice:
        // la classe che definisce il ricevitore di eventi usato 
        // dal bottone Controllo data:
        class Receiver3 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    	String SGiorno = ggStart.getText ();
    	String SMese = mmStart.getText ();
    	String SAnno = yyStart.getText ();
    
    	 try {
    //Parsing:
    	int day=Integer.parseInt(SGiorno);
    	int month=Integer.parseInt(SMese);
    	int year=Integer.parseInt(SAnno);
    
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
    //Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
    // né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.
    
    		cal.get (Calendar.DATE);
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");
    
    	} catch (NumberFormatException n) {
    		testoOutput.setText("Per eseguire il comando \"Controllo data\" \n accertarsi che i campi Giorno, Mese e Anni iniziale siano valorizzati con cifre da 0 a 9.");
    
    		} catch (IllegalArgumentException i) {
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	}
          }
        }
    però in compilazione mi da quest'errore:
    codice:
    myCalendar2.java:195: error: day cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                    ^^^
    myCalendar2.java:195: error: month cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                              ^^^^^
    myCalendar2.java:195: error: year cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                                          ^^^^
    3 problems (3 errors)
    Gato

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    però in compilazione mi da quest'errore:
    codice:
    myCalendar2.java:195 : error: day cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                    ^^^
    myCalendar2.java:195 : error: month cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                              ^^^^^
    myCalendar2.java:195 : error: year cannot be resolved
    	testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    	                                          ^^^^
    3 problems (3 errors)
    Ovviamente .... perché le variabili day/month/year sono dichiarate nel corpo { } del try quindi hanno "vita" solo lì dentro.

    Dichiarale fuori (prima, chiaramente) del try.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Intendi così?
    codice:
        // la classe che definisce il ricevitore di eventi usato 
        // dal bottone Controllo data:
        class Receiver3 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    	String SGiorno = ggStart.getText ();
    	String SMese = mmStart.getText ();
    	String SAnno = yyStart.getText ();
    
    //Parsing: prima del blocco try
    	int day=Integer.parseInt(SGiorno);
    	int month=Integer.parseInt(SMese);
    	int year=Integer.parseInt(SAnno);
    
    	 try {
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
    //Le stringhe sono oggetti "immutabili". Non esiste un metodo setText()
    // né esiste un qualche altro metodo che modifica lo stato dell'oggetto String.
    //		try {
    		cal.get (Calendar.DATE);
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data corretta.");
    
    	} catch (NumberFormatException n) {
    		testoOutput.setText("Per eseguire il comando \"Controllo data\" \n accertarsi che i campi Giorno, Mese e Anni iniziale siano valorizzati con cifre da 0 a 9.");
    
    		} catch (IllegalArgumentException i) {
    		      testoOutput.setText(day +"/"+ month +"/"+ year + ": data errata.");
    Ma così non "prende" più il NumberFormatException...
    Gato

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    Intendi così?

    Ma così non "prende" più il NumberFormatException...
    Ho detto dichiararle .... non fare l'assegnamento con il risultato di parseInt ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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 © 2025 vBulletin Solutions, Inc. All rights reserved.