Я играл с некоторым кодом, чтобы сделать конструкцию типа закрытия (кстати, не работает)
Все выглядело нормально, но когда я пытался получить доступ к последней локальной переменной в коде, выдается исключение InstantiationException
.
Если я удалю доступ к локальной переменной, либо удалив ее полностью, либо вместо этого присвоив ей атрибут класса, исключений не будет.
В документе сказано: InstantiationException
Брошенный, когда приложение пытается создать экземпляр класса, используя метод newInstance в классе Class, но конкретный объект класса не может быть создан. Инстанцирование может завершиться неудачей по разным причинам, включая, но не ограничиваясь:
- объект класса представляет абстрактный класс, интерфейс, класс массива, тип примитива или void
- класс не имеет нулевого конструктора
Какая еще причина могла вызвать эту проблему?
Вот код. комментарий / раскомментируйте атрибут класса / локальную переменную, чтобы увидеть эффект (строки: 5 и 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 );
}
}
}
Это ошибка в Java?
редактировать
О, я забыл, трассировка стека (когда выбрасывается):
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)