Я играл с некоторым кодом, чтобы сделать закрытие, подобное конструкции (кстати, не работает)
Все выглядело нормально, но когда я попытался получить доступ к последней локальной переменной в коде, возникло исключение InstantiationException
.
Если я удалю доступ к локальной переменной либо полностью удалив ее, либо вместо этого сделав ее атрибутом класса, исключения не произойдет.
В документе говорится: InstantiationException
Вызывается, когда приложение пытается создать экземпляр класса с помощью метода newInstance в классе Class, но не удается создать экземпляр указанного объекта класса. Создание экземпляра может завершиться неудачей по разным причинам, включая, помимо прочего:
- объект класса представляет абстрактный класс, интерфейс, класс массива, примитивный тип или пустоту
- в классе нет конструктора nullary
Какая еще причина могла вызвать эту проблему?
Вот код. прокомментируйте/раскомментируйте атрибут класса/локальную переменную, чтобы увидеть эффект (строки: 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)
static
, а первый — нет. В результате блок инициализатора выполняется перед конструктором. Он не используется широко, потому что на первом месте стоят конструкторы, а конструкцияstatic {}
является альтернативой инициализации ресурсов класса, поскольку конструкторов классов нет. - person OscarRyz   schedule 26.05.2010