Durante il tentativo di eseguire il debug di un problema strano in cui sapevo che un'eccezione avrebbe dovuto essere generata ma non lo era, ho trovato quanto segue nella classe java.lang.ClassLoader
della libreria standard Java:
/**
* Open for reading, a resource of the specified name from the search path
* used to load classes. This method locates the resource through the
* system class loader (see {@link #getSystemClassLoader()}).
*
* @param name
* The resource name
*
* @return An input stream for reading the resource, or <tt>null</tt>
* if the resource could not be found
*
* @since 1.1
*/
public static InputStream getSystemResourceAsStream(String name) {
URL url = getSystemResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}
Quale motivo ci sarebbe dove è stata presa la decisione che questa eccezione non dovrebbe essere lanciata ma invece consumata silenziosamente?
Pur discutendo di questo con un collega una possibile opzione era che forse questa funzione precedesse IOException e quindi questo fu aggiunto per mantenere la retrocompatibilità, tuttavia questo metodo fu aggiunto in Java 1.1, mentre IOException fu aggiunto in 1.0.
Questa è un'operazione di file quindi IOExceptions non sarebbe fuori luogo, quindi perché i produttori di una lingua basata su eccezioni scelgono di restituire null superando un'eccezione generata?