8.空指標異常

weixin_34239169發表於2017-11-01

物件陣列不能直接使用,因為會報空指標異常

publicstaticvoidmain(String[] args) {

Customercustomer=newCustomer();

Scannerscanner=newScanner(System.in);

CustomerBiz biz=newCustomerBiz();

for(inti = 0; i < biz.cArray.length; i++) {

biz.cArray[i]=newCustomer();

//必須先初始化

System.out.println("請輸入姓名:");

biz.cArray[i].name=scanner.next();

System.out.println("請輸入年齡:");

biz.cArray[i].age=scanner.nextInt();

biz.addCustomer(biz.cArray[i]);

}

biz.show();

}

}

如果直接使用會報錯,本身來說是並沒有問題的,

但是因為stu是一個Student類的陣列,裡面的元素都是物件,

而此時所有的元素都沒有賦值,預設的初始值為null,

使用null.成員變數或者null.成員方法 都會提示NullPointerException的錯誤

·直接使用會報錯的例子

·解決方法

o方法一

o方法二

o方法三(變種)

o方法四(for迴圈直接用stu[i] = new Stu初始化)

直接使用會報錯的例子

publicclass ObjectArray{

publicstaticvoid main(String[] args)

{

Student[] stu =newStudent[10];

//如下這種寫法會報錯, 本身來說是並沒有問題的,

//但是因為stu是一個Student類的陣列,裡面的元素都是物件,

//而此時所有的元素都沒有賦值,預設的初始值為null,

//使用null.成員變數或者null.成員方法

//都會提示NullPointerException的錯誤

stu[0].name ="張三";//-->會報NullPointerException錯誤

/*

上面的程式已經出錯,後面的就都省略了

*/

}

}

class Student{

publicStringname;

publicint age;

publicStringtel;

publicStringtoString()

{

return"姓名:"+this.name+", 年齡"+this.age+",電話"+this.tel;

}

}

解決方法

方法1

使用構造方法進行賦值

publicclass ObjectArray{

publicstaticvoid main(String[] args)

{

//直接用構造方法給物件賦值

Student stu1 =newStudent("張三",20,"18880472012");

Student stu2 =newStudent("李四",22,"13666150682");

Student stu3 =newStudent("王五",18,"13433430766");

//將上面構造方法new好的物件,分別賦給陣列

Student[] stu =newStudent[3];

stu[0] = stu1;

stu[1] = stu2;

stu[2] = stu3;

for(int i =0; i

{

System.out.println(stu[i]);//-->因為已經重寫過toString方法,所以可以直接列印陣列

}

}

}

class Student{

//將成員變數順便封裝一下

privateStringname;

privateint age;

privateStringtel;

//寫一個構造方法,以便在主函式中直接呼叫賦值

publicStudent(Stringname;int age;Stringtel)

{

this.name = name;

this.age = age;

this.tel = tel;

}

publicStringtoString()

{

return"姓名:"+this.name+", 年齡"+this.age+",電話"+this.tel;

}

}

方法2

對各成員變數分別賦值

publicclass ObjectArray{

publicstaticvoid main(String[] args)

{

//new 一個stu1, 再用物件.成員變數的方法將各屬性賦值

Student stu1 =newStudent();

stu1.name ="張三";

stu1.age =20;

stu1.tel ="18880472012";

//new 一個stu2, 再用物件.成員變數的方法將各屬性賦值

Student stu2 =newStudent();

stu2.name ="李四";

stu2.age =22;

stu2.tel ="13666150682";

//new 一個stu3, 再用物件.成員變數的方法將各屬性賦值

Student stu3 =newStudent();

stu3.name ="王五";

stu3.age =18;

stu3.tel ="13433430766";

//new 一個Student陣列, 分別將stu1,stu2,stu3的值賦給對應的陣列元素

Student[] stu =newStudent[3];

stu[0] = stu1;

stu[1] = stu2;

stu[2] = stu3;

}

}

class Student{

publicStringname;

publicint age;

publicStringtel;

publicStringtoString()

{

return"姓名:"+this.name+", 年齡"+this.age+",電話"+this.tel;

}

}

方法3(變種)

使用for迴圈對各元素進行賦值

import java.util.Scanner;publicclassObjectArray

{

privatestaticScannerin;

public static void main(String[] args)

{

in=newScanner(System.in);

Student[] stu =newStudent[3];

for(inti =0;i

{

//臨時的stuI一定要在for裡面定義,否則stuI賦給stu[i]之後,

//因為指向相同,stu[i]會被不斷的複寫,最後會出現所有的stu的值全部一樣

Student stuI =newStudent();

//給成員變數初始化

System.out.println("請輸入第"+(i+1)+"個學生的資訊:");

System.out.println("姓名:");

stuI.name =in.next();

System.out.println("年齡:");

stuI.age =in.nextInt();

System.out.println("電話:");

stuI.tel =in.next();

//將stuI賦給stu[i]

stu[i] = stuI;

}

//列印

for(inti =0;i

{

System.out.println(stu[i]);

}

}

}

classStudent

{

publicString name;

publicintage;

publicString tel;

public String toString()

{

return"姓名:"+this.name+", 年齡"+this.age+",電話"+this.tel;

}

}

方法4

直接給stu[i]賦new Student()物件, 來規避NullPointer Exception錯誤

publicclasstest1111

{

public static void main(String [] args)

{

Stu[] stu =newStu[3];

for(inti =0; i

{

//直接用stu[i] = new Stu()來將null變為new Stu();

stu[i] =newStu();

stu[i].setName("張三");

stu[i].setAge(15);

}

for(inti =0;i

{

System.out.println(stu[i]);

}

}

}

classStu

{

privateString name;

privateintage;

public String getName()

{

returnname;

}

public void setName(String name)

{

this.name = name;

}

public int getAge()

{

returnage;

}

public void setAge(int age)

{

this.age = age;

}

public String toString()

{

returnthis.name+" : "+this.age;

}

}

相關文章