私は「クロージャーのような」構造を作るためにいくつかのコードで遊んでいました(ところで機能していません)
すべてが正常に見えましたが、コード内の最後のローカル変数にアクセスしようとすると、例外InstantiationException
がスローされます。
ローカル変数へのアクセスを完全に削除するか、代わりにクラス属性にすることで削除しても、例外は発生しません。
ドキュメントによると:InstantiationException
アプリケーションがクラスClassのnewInstanceメソッドを使用してクラスのインスタンスを作成しようとしたが、指定されたクラスオブジェクトをインスタンス化できない場合にスローされます。インスタンス化は、次のようなさまざまな理由で失敗する可能性があります。
-クラスオブジェクトは、抽象クラス、インターフェイス、配列クラス、プリミティブ型、またはvoidを表します
-クラスには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)