newInstance() 抛出异常的问题

philo_xu 2008-01-26 05:19:39
我的代码如下:

class ClassTest
{

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
/**System.out.println("before new point");
new Point();
System.out.println("after new point");
try
{
Class.forName("Line");
}
catch (Exception e)
{
e.printStackTrace();
}
*/
if(args.length!=1)
{
return ;
}
try
{
Class c;
c = Class.forName(args[0]);
Point pt = (Point) c.newInstance();
pt.output();
}
catch(InstantiationException e)
{
e.printStackTrace();
}catch(IllegalAccessException r)
{
r.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}

class Point
{

int x;
int y;
Point(int x,int y)
{
this.x = x;
this.y = y;

}
static
{
System.out.println("Loading Point");
}
void output()
{
System.out.println("x= "+x+",y="+y);
}
}

class Line
{
static
{
System.out.println("Line loading");
}
}


不是说newInstance()调用类中缺省的构造方法吗?

如果我在类里面写了有参数的构造方法,那么在使用newInstance()的时候应该会抛出异常的呀。

但是我在eclipse上面运行“Run as Java application”确什么结果都没有。也没有获取到异常。
而我用命令提示符来测试的时候先javac ClassTest.java
然后java ClassTest Point
居然能够打印出: Loding Point
x=0,y=0

这个问题非常头疼。望牛人帮忙解答一下。
...全文
549 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
philo_xu 2008-01-28
  • 打赏
  • 举报
回复

我在同一个包下面还有一个StringTest的类。里面也有一个Point类,这个类是有一个缺省的构造方法。

后来我将StringTest类里面的Point类名改成Point1了,可是run了之后还是

能打印出

Loading Point
x=0,y=0

是不是因为缓存的问题,就是内存中原来已经将newInstance()去调了StringTest类当中的缺省的构造方法了

等后来就算改掉了程序也不能反映出来?


另我的代码拿回家来在eclipse上运行确实能够抛出异常。但是在办公室里的时候就是那个原因导致的不能抛出异常吗?

感觉很诡异的呀。
huoyin 2008-01-26
  • 打赏
  • 举报
回复
我直接在c = Class.forName(args[0]);下面写了一个args[0]=“Point”;
这样可以不?


不行,如果没有加point参数,你的程序已经return了,不会执行你上面加的那个语句,按照maodie007(帽子)所说的家一下就好了
mcluvin 2008-01-26
  • 打赏
  • 举报
回复
反正newInstance()调用无参构造器是不会错的。你把*.class文件删了再试不就行了
maodie007 2008-01-26
  • 打赏
  • 举报
回复
API文档是这么说的
className - 所需类的完全限定名
maodie007 2008-01-26
  • 打赏
  • 举报
回复
你有没有在eclipse 加 Point 命令行参数啊?

答:run ->Open Run dialog..->Arguments
在Program arguments 中填写
如:Point
老紫竹 2008-01-26
  • 打赏
  • 举报
回复
然后java ClassTest Point
居然能够打印出: Loding Point
x=0,y=0


唯一的解释,你在编译ClassTest的时候,并没有编译Point类
而那个类的前一个版本,还存在默认的构造器。

这也是用IDE的好处,会自动替你编译,就不会产生这种误差了!
老紫竹 2008-01-26
  • 打赏
  • 举报
回复
你的 class Point
可没有无参数的构造器啊!!!

我这里运行结果为
我使用的test package,命令行为
java temp test.Point

Loading Point
java.lang.InstantiationException: test.Point
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at test.temp.main(temp.java:19)
lizzz 2008-01-26
  • 打赏
  • 举报
回复
最简单的测试方式c = Class.forName("Point");
philo_xu 2008-01-26
  • 打赏
  • 举报
回复
我直接在c = Class.forName(args[0]);下面写了一个args[0]=“Point”;
这样可以不?
philo_xu 2008-01-26
  • 打赏
  • 举报
回复
在eclipse 里面怎么加Point命令行参数呢?
hitzsf 2008-01-26
  • 打赏
  • 举报
回复
Loading Point
java.lang.InstantiationException: Point
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at ClassTest.main(ClassTest.java:30)

你有没有在eclipse 加 Point 命令行参数啊?
lizzz 2008-01-26
  • 打赏
  • 举报
回复
“但是我在eclipse上面运行“Run as Java application”确什么结果都没有。也没有获取到异常。”
是因为
        
if(args.length!=1)
{
return ;
}

你可以在配置参数里面加上Point就可以了。

至于你说能在命令行下面输出x=0,y=0 ,我觉得不可能,我试了一下也是不可以。我用的jdk1.5.12

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧