Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [JAVA]Permettere a un metodo di lanciare piu' eccezioni

    In merito a quanto gia' discusso in un altro post

    se io ho questa funzione:

    codice:
    void scrivi( String path ) throws IOException
    {
        Iterator it = lineOfFile.entrySet().iterator();
        FileOutputStream fos = null;
        PrintStream ps = null;
    
        try {
            fos = new FileOutputStream(filename);
            ps = new PrintStream(fos);
    
            while (it.hasNext()) {
                Map.Entry entry = (Map.Entry) it.next();
                ps.println(entry.getKey() + " " + entry.getValue());
            }
        } finally {
            if (ps != null) {
                ps.close();
            } else if (fos != null) {
                fos.close();
            }
        }
    
    }
    Non faccio alcun controllo in merito al parametro del metodo.
    Per controllare se la stringa path e' null metto un if-end if all'interno del metodo oppure devo fare che lanci una eccezione. Nel secondo caso come faccio a dire a Java che catturi piu' eccezioni.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA]Permettere a un metodo di lanciare piu' eccezioni

    Originariamente inviato da mark85_159622
    oppure devo fare che lanci una eccezione.
    Sì, NullPointerException

    codice:
    public void scrivi(String path) throws IOException {
        if (path == null) {
            throw new NullPointerException("path non deve essere null");
        }
        .....
    }
    E nota, NullPointerException è unchecked e come ho già detto non c'è obbligo di gestirle/dichiararle. Generalmente la tendenza è di non mettere nel throws le eccezioni unchecked ma di documentarle solo eventualmente nella documentazione "javadoc".

    Originariamente inviato da mark85_159622
    come faccio a dire a Java che catturi piu' eccezioni.
    Mettendo più catch per un try.

    codice:
    try {
        scrivi(unPath);
    } catch (IOException e) {
        .....
    } catch (NullPointerException e) {
        .....
    }
    Per un try puoi mettere tutti i catch che vuoi. C'è una regola da tenere presente: se hai diverse eccezioni da catturare che sono in relazione di "ereditarietà" (es. FileNotFoundException che estende IOException) devi catturare prima quelle più "specifiche" e poi quelle meno specifiche (prima FileNotFoundException poi IOException per esempio).

    Nel caso di IOException e NullPointerException, non sono in relazione, nessuna delle due è più specifica dell'altra, quindi puoi usare l'ordine che ti pare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ma se non dichiaro la NullPointerException quando una stringa e' null l'eccezione si attiva comunque.
    Quindi in teoria non ci sarebbe bisogno di fare un if per controllare che la variabile sia null?
    Tanto se e' null Java lancia una eccezione indipendetemente che io usi throws oppure no.
    Dovro' solo catturare questa eccezione nel metodo chiamante.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mark85_159622
    Ma se non dichiaro la NullPointerException quando una stringa e' null l'eccezione si attiva comunque.
    La dichiarazione con throws serve ed è obbligatoria solo per le eccezioni checked, proprio per "forzare" il chiamante a doverne tenere conto!!
    Per quelle unchecked non c'è alcun obbligo, l'ho già detto.

    Originariamente inviato da mark85_159622
    Quindi in teoria non ci sarebbe bisogno di fare un if per controllare che la variabile sia null?
    Diciamo che in generale no, non sarebbe obbligatorio ma bisogna vedere dove poi viene usata la stringa, perché ovviamente il problema si sposta più avanti.

    Nel tuo caso viene passata al costruttore di FileOutputStream, che appunto lancia NullPointerException. Ma senza alcun messaggio specifico. Ecco perché se fai tu il test puoi lanciare la eccezione che vuoi e specificare un messaggio più appropriato.

    Originariamente inviato da mark85_159622
    Tanto se e' null Java lancia una eccezione indipendetemente che io usi throws oppure no.
    Ripeto che dipende dove/come usi la stringa. Se cerchi di invocare un metodo su quel String ovviamente è la JVM che lancia direttamente NullPointerException! Se la passi a FileOutputStream lì dentro c'è un if ... esattamente come ho fatto io (il test è solo spostato più in la). Se la concateni ad un'altra stringa, non lancia un bel nulla, ottieni la stringa "null". Se la passi a qualcos'altro, bisogna vedere la documentazione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Se io scrivo:

    codice:
    	public String getIDToSearch() 
    	{ 
    		if( IDToSearch == null ) throw new NullPointerException( "ID is null" );
    		else return IDToSearch; 
    	}
    non c'e' bisogno di mettere:

    codice:
    	public String getIDToSearch() throws NullPointerExceptio 
    	{ 
    		if( IDToSearch == null ) throw new NullPointerException( "ID is null" );
    		else return IDToSearch; 
    	}
    ???

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da mark85_159622
    non c'e' bisogno di mettere:

    codice:
    	public String getIDToSearch() throws NullPointerException
    ???
    Lo ripeto ancora una volta: le eccezioni unchecked non sei obbligato a dichiararle nel throws e non sei obbligato a gestirle (catturandole).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    OK!!!

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.