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;在后续使用的时候再进行初始化赋值。这也是错误原理分析。
后续持续添加… …
相关文章推荐
- JAVA Maven项目如何实现定时任务
- spring 事务配置
- Xcode自定义Eclipse中常用的快捷键
- binary search(java)
- Java原型模式之基础
- hibernate、spring、c3p0整合(连接池)
- Java 的 ClassLoader 机制
- java连接MySql数据库 zeroDa 4000 teTimeBehavior
- 【Struts2】(11)异常处理和标签
- java代码
- struts2乱码问题
- spring4采用JSR349标准校验数据
- struts2+hibernate+spring配置详解
- Java里的Arrays.asList
- JAVA代码调用url链接工具类
- Java 8集合框架源码学习——HashMap
- spring4整合rest风格配置
- Java关键字this、super使用总结
- java 导出exceL
- java实现postgres备份功能