que estaba jugando con algo de código para hacer un "cierre como" construir (no funciona por cierto)¿Por qué tengo esta InstantiationException en Java cuando accedo a las variables locales finales?
Todo se veía bien, pero cuando traté de acceder a una variable local final en el código, la excepción es lanzada InstantiationException
.
Si elimino el acceso a la variable local ya sea eliminándola por completo o convirtiéndola en atributo de clase, no ocurre ninguna excepción.
El doctor dice: InstantiationException
inicia cuando una aplicación intenta crear una instancia de una clase utilizando el método newInstance en la clase clase, pero la clase de objeto especificado no se pueden crear instancias. La instanciación puede fallar por una variedad de razones, incluyendo pero no limitado a:
- la clase de objeto representa una clase abstracta, una interfaz, una clase de matriz, un tipo primitivo, o vacío
- la clase no tiene constructor nullary
¿Qué otra razón podría haber causado este problema?
Aquí está el código. comentar/descomentar el atributo de clase/variable local para ver el efecto (líneas: 5 y 10).
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class InstantiationExceptionDemo {
//static JTextField field = new JTextField();// works if uncommented
public static void main(String [] args) {
JFrame frame = new JFrame();
JButton button = new JButton("Click");
final JTextField field = new JTextField();// fails if uncommented
button.addActionListener(new _(){{
System.out.println("click " + field.getText());
}});
frame.add(field);
frame.add(button, BorderLayout.SOUTH);
frame.pack();frame.setVisible(true);
}
}
class _ implements ActionListener {
public void actionPerformed(ActionEvent e){
try {
this.getClass().newInstance();
} catch(InstantiationException ie){
throw new RuntimeException(ie);
} catch(IllegalAccessException ie){
throw new RuntimeException(ie);
}
}
}
¿Este es un error en Java?
edición
Ah, me olvidaba, el StackTrace (cuando se lanza) es:
Caused by: java.lang.InstantiationException: InstantiationExceptionDemo$1
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at _.actionPerformed(InstantiationExceptionDemo.java:25)
¿En qué línea es la excepción lanzada en – Michael
25:?. 'This.getClass() newInstance()' – OscarRyz
@Oscar: Estoy confundido acerca de la sintaxis de la interna anónima clase. ¿Se supone que es el constructor? – Uri