stavo giocando con un po 'di codice per fare un "chiusura come" costruire (non funzionante btw)Perché sto avendo questo InstantiationException in Java quando si accede alle variabili locali finali?
Tutto sembrava bene, ma quando ho cercato di accedere a una variabile locale finale nel codice, l'eccezione InstantiationException
viene gettato.
Se rimuovo l'accesso alla variabile locale rimuovendolo del tutto o rendendolo invece attributo di classe, non si verifica alcuna eccezione.
Il dottore dice: InstantiationException
generata quando un'applicazione tenta di creare un'istanza di una classe utilizzando il metodo newInstance in classe classe, ma l'oggetto della classe specificata non è possibile creare un'istanza. L'istanziazione può fallire per vari motivi, tra cui, ma non limitati a:
- all'oggetto classe rappresenta una classe astratta, un'interfaccia, una classe matrice, un tipo primitivo o vuoto
- la classe non ha un costruttore nullario
Quale altro motivo potrebbe aver causato questo problema?
Ecco il codice. commentare/commentare l'attributo di classe/variabile locale per vedere l'effetto (righe: 5 e 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);
}
}
}
Si tratta di un bug in Java?
modificare
Ah, dimenticavo, lo stacktrace (quando torta) è:
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)
Quale linea è l'eccezione gettato su – Michael
25:?. 'This.getClass() newInstance()' – OscarRyz
@Oscar: Sono confuso circa la sintassi del interna anonima classe: è questo il costruttore? – Uri