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

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

  1. 错误信息如下:

    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;在后续使用的时候再进行初始化赋值。这也是错误原理分析。

后续持续添加… …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值