为什么这样调用就会出现空指针异常呢?

ab565576540 2010-04-18 03:24:04
public class zb38
{
public static void main(String args[]){
Person p[]=new Person[3];
System.out.println("=========数组声明==========");
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i]+"、");
}
p[0].setName("张三"); //不同之处
p[1].setName("李四"); //不同之处
p[2].setName("王五"); //不同之处
System.out.println("\n==========对象实例化=============");
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i].getName()+"、");
}

}





};
class Person
{
private String name;
public Person(String name){
this.name=name;
}

public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}

};

这样调用可以编译通过,但是执行时就会出现空指针异常,然而下面的方法调用就可以编译和运行都通过

public class zb38
{
public static void main(String args[]){
Person p[]=new Person[3];
System.out.println("=========数组声明==========");
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i]+"、");
}
p[0]=new Person("张三"); //不同之处
p[1]=new Person("李四"); //不同之处
p[2]=new Person("王五"); //不同之处
System.out.println("\n==========对象实例化=============");
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i].getName()+"、");
}

}





};
class Person
{
private String name;
public Person(String name){
this.name=name;
}

public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}

};

两种方式不是都通过Person p[]=new Person[3];进行了初始化了吗?为什么第一张方式会出现空指针异常呢?难道对象数组就不能用getName()来获得参数吗?希望高手帮我解答下哈~我刚学java不久,谢谢
...全文
365 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel 2010-04-19
  • 打赏
  • 举报
回复
我来帮你分析下(我也是小白O(∩_∩)O):
Person p[]=new Person[3];

这是你实例化的一个Person对象的数组
我把这行改成
Person p=new Person(null);

下面就用
p.setName("xxxx");

来传值就可以了这里的p是一个对象
而p[0]是一个数值。数值怎么调用方法啊?
p[0]=new Person("张三");
这里是对p[0]实例化
我是这样理解- -!
ab565576540 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mars_ma_ok 的回复:]
二楼正解....

你可以在是这样写:

Java code

if(p != null) {
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i]+"、");
}
.
.
.
.
}
[/Quote]

按你说的加了,还是一样的空指针啊,能不能有谁具体点讲解一下啊~
ab565576540 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 saintwinter 的回复:]
引用 6 楼 ab565576540 的回复:
楼上的兄弟:getName()是在Person类中定义的呀,只是在main函数中调用而已呀...

不好意思,很久没有接触JAVA。
根本原因应该是:Person类须要经由new生成类的实例,生成实例的初始化过程必须便是调用Person类中对应的初始化方法,你在Person类当中只有带参数的初始化方法,而你在第一个new的时候实际上是在调用空……
[/Quote]
我发帖之前也想过这个这个问题啊,也加了无参构造,但是好像也是一样的出项空指针异常啊。。。晕了。。
Mars_Ma_OK 2010-04-18
  • 打赏
  • 举报
回复
二楼正解....

你可以在是这样写:

if(p != null) {
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i]+"、");
}
.
.
.
.
}

Parado 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ab565576540 的回复:]
楼上的兄弟:getName()是在Person类中定义的呀,只是在main函数中调用而已呀...
[/Quote]
不好意思,很久没有接触JAVA。
根本原因应该是:Person类须要经由new生成类的实例,生成实例的初始化过程必须便是调用Person类中对应的初始化方法,你在Person类当中只有带参数的初始化方法,而你在第一个new的时候实际上是在调用空参数的初始化方法(该方法在Person类中未定义),所以第一种代码对Person类的实例化实际上并未成功,在Person类中加上空参数的Person(){}初始化方法看看。
Parado 2010-04-18
  • 打赏
  • 举报
回复
晕了,不好意思,很久没有接触JAVA。
根本原因应该是:Person类须要经由new生成类的实例,生成实例的初始化过程必须便是调用Person类中对应的初始化方法,你在Person类当中只有带参数的初始化方法,而你在第一个new的时候实际上是在调用空参数的初始化方法(该方法在Person类中未定义),所以第一种代码对Person类的实例化实际上并未成功,在Person类中加上空参数的Person(){}初始化方法看看。
Parado 2010-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 saintwinter 的回复:]
因为你是在zb38类中定义的setName()方法,而不是在Person类中,所以Person类的实例p[]数组实际上并不具有setName()方法(setName()方法实际从属zb38类),故通过p[]对象调用setName()会出现空指针异常。
[/Quote]
纠正一下:因为setName()方法是在zb38类中定义的,其相对于Person类是外部方法,而Person类的属性name为私有,是不允许外部方法修改的,故通过外部方法setName()对Person类的实例p[]当中的name值进行修改,会出现空指针异常。
ab565576540 2010-04-18
  • 打赏
  • 举报
回复
楼上的兄弟:getName()是在Person类中定义的呀,只是在main函数中调用而已呀...
Parado 2010-04-18
  • 打赏
  • 举报
回复
因为你是在zb38类中定义的setName()方法,而不是在Person类中,所以Person类的实例p[]数组实际上并不具有setName()方法(setName()方法实际从属zb38类),故通过p[]对象调用setName()会出现空指针异常。
springbird 2010-04-18
  • 打赏
  • 举报
回复
好像应该是先赋值,再打印输出吧
ab565576540 2010-04-18
  • 打赏
  • 举报
回复
p[0].setName("张三"); 现在p[0]已经是对象了呀,我这样用对象调用setName()函数没有错啊,我就是有点想不明白啊
ptcoding 2010-04-18
  • 打赏
  • 举报
回复
Person p[]=new Person[3];
System.out.println("=========数组声明==========");
for (int i=0;i<p.length ;i++ )
{
System.out.print(p[i]+"、");
}
你这里new了一个3个元素的Person数组,此时p数组里面都是null的,因为你没有给数组赋值,此时你去把p[i]打印出来,当然就是空指针异常啦
James.Ji 2010-04-18
  • 打赏
  • 举报
回复
你是初始化了一个数组,数组装的都是null,看一下基础知识吧

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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