我正在玩一些代码来制作“类似闭包”的构造(顺便说一句,不起作用)
一切看起来都很好,但是当我尝试访问代码中的最终局部变量时,出现异常InstantiationException
被抛出。
如果我通过完全删除局部变量或使其成为类属性来删除对局部变量的访问,则不会发生异常。
医生说:实例化异常 http://java.sun.com/javase/6/docs/api/java/lang/InstantiationException.html
当应用程序尝试使用类 Class 中的 newInstance 方法创建类的实例,但指定的类对象无法实例化时抛出。实例化可能会因多种原因而失败,包括但不限于:
- 类对象表示抽象类、接口、数组类、原始类型或 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 中的错误吗?
edit
哦,我忘了,堆栈跟踪(抛出时)是:
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)
嗯,这是有道理的。
只有您的第一个实例_
类可以访问局部变量。后续实例不能,除非您向它们提供它(通过构造函数arg)
Constructor[] constructor = a.getClass().getDeclaredConstructors();
for (Constructor c : constructors) {
System.out.println(c.getParameterTypes().length);
}
输出 1。(a
是您的匿名类的实例)
也就是说,我认为这不是实现闭包的好方法。初始化块至少被调用一次,而不需要它。我猜你只是在玩玩,但看看lambdaj http://code.google.com/p/lambdaj/。或者等待 Java 7 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)