Aquí está mi respuesta a mi propia pregunta, pero me encantaría ver qué otras ideas hay:
Me encantaría un bloque implícito de “prueba” para inicializar. Digamos que desea crear un objeto PickyPicky cuyo constructor declara que arroja AlmostNeverHappensException. Entonces tienes que hacer algo como esto:
PickyPicky pp = nulo; // línea A
tratar {
- ¿Hay algunas habilidades fáciles de aprender (generales) de las que carecen muchos graduados recientes de la facultad de derecho?
- Tengo una idea para un libro, sin embargo, siento que no tengo la habilidad para escribirlo. Me preguntaba si alguien estaría dispuesto a ayudarme a escribirlo.
- Cómo mejorar mis habilidades de escritura si el inglés no es mi lengua materna
- ¿Qué grupo, tribu, etc. son los mejores ‘sobrevivientes’ en el sentido de sus habilidades y conocimientos de supervivencia reales?
- ¿Qué curso debo hacer para perfeccionar mis habilidades para un mejor trabajo?
pp = nuevo PickyPicky ();
} catch (AlmostNeverHappensException anhe) {
System.out.println (“Si ve este mensaje, le compraré el almuerzo”);
regreso; // línea B
}
pp.doSomeReallyCoolStuff (); // línea C
Debe inicializar pp en nulo en la línea A porque, de lo contrario, el compilador se queja de que no se puede inicializar pp en la línea C, aunque está bastante claro que si el constructor hubiera fallado, dejando pp sin inicializar, habría salido de este procedimiento en la línea B .
Y, por supuesto, no puede declarar pp dentro del bloque try porque entonces está fuera del alcance en la línea C. Ahora, podría hacer esto …
tratar {
PickyPicky pp = nuevo PickyPicky ();
pp.doSomeReallyCoolStuff (…);
} catch (AlmostNeverHappensException anhe) {
// etc …
}
Pero imagine que doSomeReallyCoolStuff () toma varios objetos como parámetros, cada uno de los cuales requiere su propia inicialización que podría generar su propia excepción altamente improbable. Si cada constructor necesita su propio bloque de prueba, pronto se encontrará anidado confusamente en los bloques de prueba antes de comenzar a hacer cualquier codificación real.
Mi visión para el intento implícito se vería así:
PickyPicky pp = new PickyPicky () // Línea D
catch (AlmostNeverHappensException anhe) {
// etc …
} // Línea E
pp.doSomeReallyCoolStuff ();
Tenga en cuenta que no hay punto y coma al final de la línea D; toda la declaración se extiende hasta la línea E. Es como si estuviera declarando, inicializando y entregando la posible excepción de una vez.
De esta forma, se ahorraría unas pocas líneas de código y anidaría mientras se aborda responsablemente la posibilidad de que la inicialización pueda fallar.