1. 程式人生 > >解決java.lang.NullPointerException: View must not be null!

解決java.lang.NullPointerException: View must not be null!

昨天寫專案的時候遇到一個“老朋友”:java.lang.NullPointerException: View must not be null!仔細查看了一下程式碼,發現view並不為空啊,琢磨了好久,通過查資料才發現if判斷的時候出了紕漏,這裡先放出錯誤原碼:
 case R.id.message:
                if (key.equals("1")){//如果訊息來自推送,則執行下面的請求操作
                    AlertDialog.Builder builder = new AlertDialog.Builder(MessageCenterActivity.this);
                    builder.setTitle("訂單資訊");
                    builder.setMessage("請您確認是否搶單?");
                    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            msg_layout.setVisibility(View.GONE);//取消訂單,將訂單資訊刪除隱藏
                            ToastUtil.show(MessageCenterActivity.this,"取消");
                        }
                    });
                    builder.setPositiveButton("確認搶單", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //do something


                            pushSomeOneMessage("接單成功!",userId);//給乘客回覆已接受訂單請求
                            msg_layout.setEnabled(false);//接單後阻止點選事件的二次操作
                            ToastUtil.show(MessageCenterActivity.this,"搶單成功!");
                        }
                    });
                    AlertDialog dialog = builder.create();
                    dialog.show();


                }else{//如果是已有訂單,可以設定點選彈出選單
                    msg_layout.setEnabled(false);
                }


                break;
錯誤原因:if判斷時沒考慮到key為空的情況
改正方法:每次判斷字串是否相等時注意加上字串是否為空的判斷。
改正如下:
case R.id.message:
                if (key!=null&&key.equals("1")){//如果訊息來自推送,則執行下面的請求操作
                    AlertDialog.Builder builder = new AlertDialog.Builder(MessageCenterActivity.this);
                    builder.setTitle("訂單資訊");
                    builder.setMessage("請您確認是否搶單?");
                    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            msg_layout.setVisibility(View.GONE);//取消訂單,將訂單資訊刪除隱藏
                            ToastUtil.show(MessageCenterActivity.this,"取消");
                        }
                    });
                    builder.setPositiveButton("確認搶單", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //do something


                            pushSomeOneMessage("接單成功!",userId);//給乘客回覆已接受訂單請求
                            msg_layout.setEnabled(false);//接單後阻止點選事件的二次操作
                            ToastUtil.show(MessageCenterActivity.this,"搶單成功!");
                        }
                    });
                    AlertDialog dialog = builder.create();
                    dialog.show();


                }else{//如果是已有訂單,可以設定點選彈出選單
                    msg_layout.setEnabled(false);
                }


                break;


一般報java.lang.NullPointerException的原因有以下幾種: 
1.字串變數未初始化; 
2.類的物件沒有用具體的初始化,比如: 
   Person p; 會報錯 
   Person p = new Person(); 則不會報錯了 
3.當一個物件的值為空時,你沒有判斷為空的情況。