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不久,谢谢

解决方案 »

  1.   

    你是初始化了一个数组,数组装的都是null,看一下基础知识吧
      

  2.   

    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]打印出来,当然就是空指针异常啦
      

  3.   

    p[0].setName("张三"); 现在p[0]已经是对象了呀,我这样用对象调用setName()函数没有错啊,我就是有点想不明白啊
      

  4.   

    因为你是在zb38类中定义的setName()方法,而不是在Person类中,所以Person类的实例p[]数组实际上并不具有setName()方法(setName()方法实际从属zb38类),故通过p[]对象调用setName()会出现空指针异常。
      

  5.   

    楼上的兄弟:getName()是在Person类中定义的呀,只是在main函数中调用而已呀...
      

  6.   

    纠正一下:因为setName()方法是在zb38类中定义的,其相对于Person类是外部方法,而Person类的属性name为私有,是不允许外部方法修改的,故通过外部方法setName()对Person类的实例p[]当中的name值进行修改,会出现空指针异常。
      

  7.   

    晕了,不好意思,很久没有接触JAVA。
    根本原因应该是:Person类须要经由new生成类的实例,生成实例的初始化过程必须便是调用Person类中对应的初始化方法,你在Person类当中只有带参数的初始化方法,而你在第一个new的时候实际上是在调用空参数的初始化方法(该方法在Person类中未定义),所以第一种代码对Person类的实例化实际上并未成功,在Person类中加上空参数的Person(){}初始化方法看看。
      

  8.   

    不好意思,很久没有接触JAVA。
    根本原因应该是:Person类须要经由new生成类的实例,生成实例的初始化过程必须便是调用Person类中对应的初始化方法,你在Person类当中只有带参数的初始化方法,而你在第一个new的时候实际上是在调用空参数的初始化方法(该方法在Person类中未定义),所以第一种代码对Person类的实例化实际上并未成功,在Person类中加上空参数的Person(){}初始化方法看看。
      

  9.   

    二楼正解....你可以在是这样写:if(p != null) {
        for (int i=0;i<p.length ;i++ )
        {
            System.out.print(p[i]+"、");
        }
    .
    .
    .
    .
    }
      

  10.   

    我来帮你分析下(我也是小白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]实例化
    我是这样理解- -!