返回信息流public class Outer{
public static void main(String[] args)throws Exception{
new Outer().hello();
}
private void hello()throws Exception{
Inner.class.newInstance().sayHi();
}
public class Inner{
public void sayHi(){
try{
System.exit(0);
System.out.println("Hello world.");
}finally{
System.out.println("Goodbye world.");
}
}
}
}
请问,如何更改才能避免异常Exception in thread "main" java.lang.InstantiationException: Outer$Inner,除了将内部类Inner改为嵌套类以外。以及为什么Inner.class.newInstance().sayHi();中的newInstance()不能执行?
这是一条镜像帖。来源:北邮人论坛 / java / #26749同步于 2013/9/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]内部类加载问题
valleychen
2013/9/1镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 hainanlxs 的大作中提到: 】
: lz用try,catch试试??我就说说。。。
此题为笔试题,原题为“问程序输出是什么”,现在已知输出是一个异常,但是不知道原因。
这个异常是在调用newInstance时候找不到无参的构造函数抛出的。
debug了一下。发现在Inner.class只有一个构造函数,参数是外部类Outer.
public Outer$Inner(Outer)
所以在调用内部类的newInstance时候会找不到。
【 在 valleychen 的大作中提到: 】
: public class Outer{
: public static void main(String[] args)throws Exception{
: new Outer().hello();
: ...................
【 在 aiquestion 的大作中提到: 】
: 这个异常是在调用newInstance时候找不到无参的构造函数抛出的。
: debug了一下。发现在Inner.class只有一个构造函数,参数是外部类Outer.
: public Outer$Inner(Outer)
: ...................
谢谢,那怎样修改呢,我知道内部类是依赖外部类而存在的,怎么做能避免这个异常?
唔。不太清楚,不过上面的代码好像看不出来是必须使用内部类啊。
好像反射调用比直接调用效率低很多。
【 在 valleychen 的大作中提到: 】
: 谢谢,那怎样修改呢,我知道内部类是依赖外部类而存在的,怎么做能避免这个异常?
如果是非嵌套类的话,你需要在堆中构建一个实例来call Inner的成员方法,另外更正下楼上的说法,即便Inner有无参构造器,在非嵌套类的情况下通过newInstance()来获得实例依然会抛InstantiationException,所以:
change
Inner.class.newInstance().sayHi();
to
new Inner().sayHi();
另外为什么要“除了嵌套类”呢?至少要解说下这样设计调用过程的初衷吧~
【 在 valleychen 的大作中提到: 】
: 谢谢,那怎样修改呢,我知道内部类是依赖外部类而存在的,怎么做能避免这个异常?
啊,有无参也会失败啊。搜噶。晚上回去试试。。
【 在 tonyjansan 的大作中提到: 】
: 如果是非嵌套类的话,你需要在堆中构建一个实例来call Inner的成员方法,另外更正下楼上的说法,即便Inner有无参构造器,在非嵌套类的情况下通过newInstance()来获得实例依然会抛InstantiationException,所以:
: change
: Inner.class.newInstance().sayHi();
: ...................
非嵌套内部类的无参构造函数是default类型,不是public,所以无法实例化。
非嵌套内部类的实例化必须由封装类的对象来实现,如果非要用反射的话,可以先获取Inner的类构造器,然后调用newInstance(Object...?initargs)。但是非常不建议这种写法。
【 在 tonyjansan 的大作中提到: 】
: 如果是非嵌套类的话,你需要在堆中构建一个实例来call Inner的成员方法,另外更正下楼上的说法,即便Inner有无参构造器,在非嵌套类的情况下通过newInstance()来获得实例依然会抛InstantiationException,所以:
: change
: Inner.class.newInstance().sayHi();
: ...................
没有什么设计初衷,这是一道笔试题,问程序的输出是什么,运行了一下才知道输出是异常,就是想知道原因,再次表示感谢。