project001Test.java
package project001.test;import java.io.IOException;import java.util.ArrayList;import java.util.List;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import net.sf.json.JsonConfig;public class project001Test { private project002Test a; public project002Test getA() { return a; } public void setA(project002Test a) { this.a = a; } public static void main(String[] arg) throws IOException{ project001Test p1 = new project001Test(); project002Test p2 = p1.getA(); System.out.println(p2.getString()[0]); }}
project002Test.java
package project001.test;public class project002Test { private String[] string = {"1","2"}; public String[] getString() { return string; } public void setString(String[] string) { this.string = string; }}
报错信息:
Exception in thread "main" java.lang.NullPointerException at project001.test.project001Test.main(project001Test.java:27)
已经给了string数组的初始值了啊.{"1","2"} 为什么还报错?
解决方案
真是蛋痛的代码~
原因是:
创建对象 project001Test 时,其中的属性只是被声明的,但是没被初始化。导致属性 a 为 null。调用 getA() 返回的是 null。
这是一个你用来学习的代码,所以类名、变量名都比较随意。但是,个人建议,每一次写代码都请认真对待,方便以后自己阅读。
类名首字母大写,这在Java里面是亘古不变的!
尽可能不要使用 a b c 这类没意义的变量名。过段时间你自己都不记得这代码写了什么
不要用 string 这类与关键字类似的名称作变量名。会混淆的
没意义的包不要引入
具体错误原因:
private Project002Test a;
仅只是声明了变量a为 Project002Test 这个类型,并未创建具体对象。因此调用 getA() 返回 null.
修改方式:
声明时直接创建
private Project002Test a = new Project002Test();
调用时判断创建
private Project002Test a; public Project002Test getA() { if (a == null) { a = new Project002Test(); } return a; }