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型局部变量的拷贝;
具体原理理解讨论可见以下两个帖子:
http://blog.csdn.net/mydreamongo/article/details/8983132
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;在后续使用的时候再进行初始化赋值。这也是错误原理分析。
后续持续添加… …