Questo è venuto in una discussione con un collega oggi.Qual è l'uso previsto di IllegalStateException?
Il Javadocs per lo stato di Java IllegalStateException
che:
segnali che un metodo è stato invocato in un momento illegale o inappropriato. In altre parole, l'ambiente Java o l'applicazione Java non sono nello stato appropriato per l'operazione richiesta.
E Effective Java dice (Articolo 60, pag 248):
Un'altra eccezione comunemente riutilizzato è IllegalStateException. Questa è generalmente l'eccezione da lanciare se l'invocazione è illegale a causa dello stato dell'oggetto ricevente. Ad esempio, questa sarebbe l'eccezione da lanciare se il chiamante ha tentato di utilizzare qualche oggetto prima che fosse inizializzato correttamente.
Sembra che ci sia un po 'di discrepanza qui. La seconda frase dei javadoc fa sembrare che l'eccezione possa descrivere una condizione molto ampia dello stato di esecuzione di Java, ma la descrizione in Java efficace lo fa sembrare come se fosse usato per condizioni legate specificamente allo stato dello stato di cui il metodo è stato chiamato.
Gli usi che ho visto nel JDK (ad es. Collezioni, Matcher
) e in Guava sembrano sicuramente rientrare nella categoria di cui parla Java efficace ("Questo oggetto è in uno stato in cui questo metodo non può essere chiamato "). Anche questo sembra coerente con il fratello IllegalStateException
IllegalArgumentException
.
Esistono alcuni legittimi usi di IllegalStateException
nel JDK che si riferiscono all'ambiente "Java" o "Applicazione Java"? Oppure le guide delle migliori pratiche sostengono di usarlo per lo stato di esecuzione più ampio? Altrimenti, perché diamine sono i javadoc così formulati? ;)
Su una nota forse non correlata, ho notato che il tag [illegalstatexception] di StackOverflow dice "In Java, un'eccezione che si verifica quando si utilizzano più thread, per cui un thread modifica un oggetto in un modo che lo rende incompatibile con l'uso di quell'oggetto nel secondo thread, ponendo l'oggetto in uno stato illegale. Eh? Da dove viene questo? –
"L'applicazione Java" è quella che scrivi e puoi usare 'IllegalStateException' lì (direttamente o perché stai usando Guava, per esempio). Dov'è la discrepanza? –
Il tag wiki sembra fasullo, ho inviato una modifica prendendo a prestito liberamente da questa domanda; dovresti vedere la nuova versione una volta passata la peer review. – meriton