解決java.lang.NullPointerException: View must not be null!
阿新 • • 發佈:2019-01-29
昨天寫專案的時候遇到一個“老朋友”: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.當一個物件的值為空時,你沒有判斷為空的情況。
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.當一個物件的值為空時,你沒有判斷為空的情況。