您的位置:首页 > 编程语言 > Java开发

Java初级开发中常常遇到的Bug 系列

2015-12-18 14:29 609 查看

Java初级开发中常常遇到的Bug

错误信息如下:

Attempt to invoke interface method 'boolean java.util.List.add(java.lang.Object)' on a null object reference;


尝试在一个空的对象引用上引用boolean java.util.List.add()这个方法;

错误例子:

List<Employee> employeelist = null;
//employeelist = new ArrayList<Employee>();
employeelist.add(new Employee("w8623", "Yang Maosheng", 11));
employeelist.add(new Employee("w8624", "Zhang San", 22));
employeelist.add(new Employee("w8625", "Li Si", 2));


由于调用了employeelist的add方法,所以必须对employlist进行初始化,否则会报上述错误;一个指向null的对象是不存在add方法的,故要使用一个合法的对象引用;修改原理就是:对该对象进行初始化:

List<Employee> employeelist = new ArrayList<Employee>();
employeelist.add(new Employee("w8623", "Yang Maosheng", 11));
employeelist.add(new Employee("w8624", "Zhang San", 22));
employeelist.add(new Employee("w8625", "Li Si", 2));


2 .错误信息如下:

Cannot refer to a non-final variable position inside an inner class defined in a different method


在另外的的方法中初始化一个内部类,内部类不能使用所在方法中一个非final的变量;

错误例子:

第16行会提示该错误

public class HelloTP {

public static void main(String[] args) {
// TODO Auto-generated method stub
test();
if (args.length != 0) {
System.out.println(args[0]);
}
}

public void test() {
String str = "Hello World";
class Inner {

public void out() {
System.out.println(str);
}

}
}


修改方法是将第12行String str = “Hello World”改为final String str = “Hello World”;

原理分析:

其实可以按照JAVA编译原理来分析:HelloTP 和Inner 被编译成两个class文件,故不能访问其他类中方法中的局部变量;

其实归根到底,可以理解为局部变量的生命周期所限,由于局部变量存在于栈中,是与方法共存亡的;当实例化的内部类进行访问局部变量时(此时它已经不复存在,被栈弹出,或者压根没有入栈),就会出错,Java为了防止该类错误,要求内部类访问的局部变量应为final类型;

局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝;

具体原理理解讨论可见以下两个帖子:

/article/9521189.html

http://bbs.csdn.net/topics/220029494/

3.错误信息如下:

java.lang.NullPointerException:lock ==null


空指针错误;详细错误如下:

12-17 13:06:53.833: E/AndroidRuntime(1778): FATAL EXCEPTION: Thread-195
12-17 13:06:53.833: E/AndroidRuntime(1778): Process: com.tplink.javatraining2, PID: 1778
12-17 13:06:53.833: E/AndroidRuntime(1778): java.lang.NullPointerException: lock == null
12-17 13:06:53.833: E/AndroidRuntime(1778):     at java.io.Writer.<init>(Writer.java:62)
12-17 13:06:53.833: E/AndroidRuntime(1778):     at java.io.BufferedWriter.<init>(BufferedWriter.java:66)
12-17 13:06:53.833: E/AndroidRuntime(1778):     at java.io.BufferedWriter.<init>(BufferedWriter.java:54)
12-17 13:06:53.833: E/AndroidRuntime(1778):     at com.tplink.javatraining4.model.JsonFileHelper.saveJsonToSdCard(JsonFileHelper.java:62)
12-17 13:06:53.833: E/AndroidRuntime(1778):     at com.tplink.javatraining4.model.JsonFileHelper.readJsonFromSdCard(JsonFileHelper.java:117)
12-17 13:06:53.833: E/AndroidRuntime(1778):     at com.tplink.javatraining4.MainListActivity$ReadJsonThread.run(MainListActivity.java:126)


这里跟大家分享遇到错误的小体会:

1、不要惧怕错误;误有助于更好去理解程序,可以加深自己的功力

2、学会抓住重点;并身临其境中去揣度发生错误的地方

Java报错是自底向上机制:即从运行态发生错误的地方开始,然后追溯调用它的地方(方法),一直追溯到应用的最上层。

该错误为Writer->BufferedWriter->JsonFileHelper->MainListActivity;重点的查看报错的代码行及其前后几行,下面贴出错误代码:

JsonFileHelper.java:62

if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}

// BufferedWriter bw = null;
BufferedWriter bw = new BufferedWriter(null);//第62行

try {
/* Json文件的写入流 */
bw = new BufferedWriter(new FileWriter(file));

String jsonSting = EmployeeHelper
.getJsonFromEmplyee(employees);

/* 将解析json文件的内容写入到文件 */
bw.write(jsonSting);
bw.flush();


JsonFileHelper.java:117

if (!file.exists()) {
ArrayList<Employee> mTempEmployeess = EmployeeHelper
.getEmployeelist();
saveJsonToSdCard(mTempEmployeess);//第117行
employees = mTempEmployeess;
}


MainListActivity.java:126

public class ReadJsonThread extends Thread {

@Override
public void run() {
// TODO Auto-generated method stub
ArrayList<Employee> readEmployees = new ArrayList<Employee>();
readEmployees = JsonFileHelper.readJsonFromSdCard();//第126行

if (!readEmployees.isEmpty()) {
mTempeployees.clear();
mTempeployees.addAll(readEmployees);
Message msg = new Message();
msg.what = MESSAGE_RAED;
readHandler.sendMessage(msg);
}
}

}


可以根据代码走读下流程:MainListActivity中启动ReadJsonThread线程,然后调用JsonFileHelper类的readJsonFromSdCard()方法(该方法中到底是什么功能暂不详细描述),readJsonFromSdCard方法中调用saveJsonToSdCard(mTempEmployeess)方法;后在saveJsonToSdCard(mTempEmployeess)方法中走到BufferedWriter bw = new BufferedWriter(null);这句话出错;对比错误信息,可推断是该行代码引起;然后阅读这行代码及前后几行。

文件读写中传入的writer为null导致错误,应更正为BufferedWriter bw = null;在后续使用的时候再进行初始化赋值。这也是错误原理分析。

后续持续添加… …
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: