在Java(Android)中检查null和“emptyness” --> 崩溃

3

我创建了一个if/else语句,检查编辑文本的值(编辑文本的值保存在myPrefs中)是否为空。如果为空,则会显示错误。如果不为空,则会显示另一个对话框,用户可以在应用程序中继续操作。这就是我想要的。

问题是,在检查它是否为空时,应用程序会崩溃。这是我的代码,我已经实现了||(使用nullisEqual("")),但没有成功。

if (myPrefs.getString("TELHUISARTS", null).equals("") || myPrefs.getString("TELHUISARTS",null).equals(null)) {
    String contactWithQuotes = getResources().getString(R.string.Contactwithquotes);

    AlertDialog.Builder alertDialogBuilder2 = new AlertDialog.Builder(Gevaar.this);

    // set title
    alertDialogBuilder2.setTitle("No phone number found");

    // set dialog message
    alertDialogBuilder2
        .setMessage("You have not entered a phone number for your GP. You can do this at " +contactWithQuotes+ ".")
        .setCancelable(false)
        .setNegativeButton("OK",new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int id) {
                // if this button is clicked, just close
                // the dialog box and do nothing
                dialog.cancel();
            }
        });

    AlertDialog alertDialog2 = alertDialogBuilder2.create();

    // show it
    alertDialog2.show();
} else {
    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();

    // show it
    alertDialog.show();

}

错误提示:
05-01 23:17:09.295  24300-24300/com.company.myapp 
E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.company.myapp, PID: 24300
    java.lang.NullPointerException
            at com.company.myapp.Gevaar$11.onClick(Gevaar.java:609)
            at android.view.View.performClick(View.java:4456)
            at android.view.View$PerformClick.run(View.java:18465)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

发布logcat/错误日志 - Rod_Algonquin
你的 EditText 叫做 myPrefs 吗? - Karan
@Kay 我认为这是一个 SharedPreferences 对象,因为它的名称和 getString 方法。 - PPartisan
@Kay 这是一个SharedPreferences,其中保存了EditText的值。 - Stylo
4个回答

4
您可能希望将您的条件更改为:
 if (myPrefs.getString("TELHUISARTS", null).equals("") || myPrefs.getString("TELHUISARTS",null).equals(null))

致:

 if (myPrefs.getString("TELHUISARTS",null) == null || myPrefs.getString("TELHUISARTS", null).equals(""))

您现在的方式,如果myPrefs.getString("TELHUISARTS",null)确实是null,那么您会在第一个检查处得到一个NullPointerException,因为它相当于调用null.equals("")。此外,您应该使用==而不是equals()来检查引用是否为null


如果它是null,他在第二个检查中也会得到NPE。顺序有什么关系? - Karan
@Kay,检查“null”的顺序和方式都很重要。如果 OP 用“==”替换“equals”,但不改变顺序,他们仍然会得到一个“NullPointerException”。 - Anderson Vieira
myPrefs.getString("TELHUISARTS", null).equals("")语句将在两种情况下执行。如果它为null,则在两种情况下都会抛出NPE。我有什么遗漏吗? - Karan
2
@Kay || 运算符会在第一个条件为 true 时短路,因此第二个条件不会被执行。 - Anderson Vieira
@Anderson - 谢谢!我随着时间的流逝忘记了这个..<3 所以,即 - Karan

3

myPrefs.getString("TELHUISARTS", null).equals("") 替换为

"".equals(myPrefs.getString("TELHUISARTS", null))

原因是 "".equals(null) 返回 false,而 null.equals("") 会导致程序崩溃,因为它是在一个空对象上执行的。


总体来说,这是一个不错的建议,但在这种情况下,如果myPrefs.getString("TELHUISARTS", null)null,它仍然会在第二个条件中抛出NullPointerException - Anderson Vieira

2
在Android中的SharedPreferences中,
myPrefs.getString("", "")

getString()方法中,第二个参数被定义为获取当前键没有设置任何值时的情况。

所以在您的情况下,

您必须首先检查您的偏好设置myPrefsNULL还是不是NULL,如果它不是NULL,则只能从中使用键TELHUISARTS获取字符串。

因此,在您的情况下,您的if条件应该是:

if(myPrefs == null || myPrefs.getString("TELHUISARTS", "").equals(""))

2

getString()方法的第二个参数的目的是为了处理getString()返回null的情况,以避免NullPointerException。因此,我个人不会将null作为参数传递。相反,我会编写类似以下代码:

private static final String FAIL_CODE = "here_comes_the_fail_train";
private static final String GET_STRING_PREF= "telhuisarts";

if (myPrefs.getString(GET_STRING_PREF, FAIL_CODE).equals(FAIL_CODE)) {
                    //You returned a null value, so you can account for it here...

这是我认为最佳的方法。 - gaborsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接