在Java中检查空值

在Java中检查空值,java,android,json,gson,Java,Android,Json,Gson,我正在尝试修改一个Android应用程序,该应用程序正在从服务器提取一些JSON JSONObject mResult = new JSONObject((String) result); 然后用它从我的赞助商类构造一个对象 Gson mGson = new Gson(); mSponsor = mGson.fromJson(mResult.getJSONObject("data").getJSONObject("sponsor").toString(), Sponsor.class); 发

我正在尝试修改一个Android应用程序,该应用程序正在从服务器提取一些JSON

JSONObject mResult = new JSONObject((String) result);
然后用它从我的赞助商类构造一个对象

Gson mGson = new Gson();
mSponsor = mGson.fromJson(mResult.getJSONObject("data").getJSONObject("sponsor").toString(), Sponsor.class);
发起类只是一个包含setter和getter的shell,没有完成任何逻辑。大概是这样的:

public class Sponsor {

    @SerializedName("address1")
    private String Address1;
    @SerializedName("address2")
    private String Address2;

    public Sponsor(String address1, String address2) {
        Address1 = address1;
        Address2 = address2;
    }

    public Sponsor() {
        Address1 = "";
        Address2 = "";
    }

    public String getAddress1() {
        return Address1;
    }

    public void setAddress1(String address1) {
        Address1 = address1;
    }

    public String getAddress2() {
        return Address2;
    }

    public void setAddress2(String address2) {
        Address2 = address2;
    }
}
该应用程序将地址放在文本视图中,如下所示:

txtAddress = (TextView) view.findViewById(R.id.txt_sponsor_address);
txtAddress.setText(mSponsor.getAddress1() + "\n" + mSponsor.getAddress2());
这一切都有效,但当服务器为address2返回null时除外,在这种情况下,文本null将打印在TextView中,address2应该在其中

我的问题是我怎样才能摆脱空值

我尝试了一些不同的方法,从一个简单的三元语句开始,变得越来越冗长,但没有一种方法能奏效

以下是我迄今为止尝试过的最新和最可笑的事情:

String addr2 = ((String) mSponsor.getAddress2()).trim();
String a2;
if((addr2 == "null") || (addr2 == "")) a2 = (String) "";
else a2 = (String) addr2;

txtAddress.setText(mSponsor.getAddress1() + "\n" + a2);
这会导致应用程序在我打开该活动时崩溃


我是Java的noob,所以如果可以,请提供参考资料。

您可以在赞助商类中创建另一个getter,您可以在该类中使用逻辑获取格式化地址:

public String getFormattedAddress() {
    if (!TextUtils.isEmpty(Address1) && !TextUtils.isEmpty(Address2)
        && !Address1.equalsIgnoreCase("null") && !Address2.equalsIgnoreCase("null")) {
      return (Address1 + "\n" + Address2);
    }
    if (!TextUtils.isEmpty(Address1) && !Address1.equalsIgnoreCase("null")) {
      return (Address1);
    }
    if (!TextUtils.isEmpty(Address2) && !Address2.equalsIgnoreCase("null")) {
      return (Address2);
    }
    return ("");
}
然后简单地用以下命令设置文本:


txtAddress.setTextmSponsor.getFormattedAddress

您可以在赞助者类中创建另一个getter,您可以在其中使用逻辑来获取格式化地址:

public String getFormattedAddress() {
    if (!TextUtils.isEmpty(Address1) && !TextUtils.isEmpty(Address2)
        && !Address1.equalsIgnoreCase("null") && !Address2.equalsIgnoreCase("null")) {
      return (Address1 + "\n" + Address2);
    }
    if (!TextUtils.isEmpty(Address1) && !Address1.equalsIgnoreCase("null")) {
      return (Address1);
    }
    if (!TextUtils.isEmpty(Address2) && !Address2.equalsIgnoreCase("null")) {
      return (Address2);
    }
    return ("");
}
然后简单地用以下命令设置文本:

txtAddress.setTextmSponsor.getFormattedAddress

您不应使用:

if((addr2 == "null")
用于字符串比较:

if (addr2.equalsIgnoreCase("null"))
您不应使用:

if((addr2 == "null")
用于字符串比较:

if (addr2.equalsIgnoreCase("null"))

getAddress2未返回文本字符串null。它返回一个空引用,当您在串联中打印它时,StringBuilder将其转换为空字符串。这就是为什么当你试图删减单词时它会崩溃

解决这个问题的一个简单方法是将三元运算符放入getter本身,如下所示:

public String getAddress2() {
  return (Address2 == null) ? "" : Address2;
}

现在,您将永远不会返回null引用,并且无需任何检查即可安全地使用它。

getAddress2不会返回文本字符串null。它返回一个空引用,当您在串联中打印它时,StringBuilder将其转换为空字符串。这就是为什么当你试图删减单词时它会崩溃

解决这个问题的一个简单方法是将三元运算符放入getter本身,如下所示:

public String getAddress2() {
  return (Address2 == null) ? "" : Address2;
}
现在,您将永远不会返回空引用,您可以安全地使用它而无需任何检查。

这如何

// if null, addr2="", if not null, addr = getAddress2()'s result 
String addr2 = mSponsor.getAddress2() == null ? "" : ((String) mSponsor.getAddress2()).trim();

txtAddress.setText(mSponsor.getAddress1() + "\n" + addr2);
这个怎么样

// if null, addr2="", if not null, addr = getAddress2()'s result 
String addr2 = mSponsor.getAddress2() == null ? "" : ((String) mSponsor.getAddress2()).trim();

txtAddress.setText(mSponsor.getAddress1() + "\n" + addr2);
为您的getter代码尝试以下操作:

当然,您可以对Address1的其他getter执行相同的操作。 此外,如果要检查空字符串,请使用Address2.length==0,而不是Address2==。

为getter代码尝试以下方法:

当然,您可以对Address1的其他getter执行相同的操作。
另外,如果您想检查空字符串,请使用Address2.length==0,而不是Address2==。

您是否尝试过addr2.equalsnull或addr2==null?您是否尝试过addr2.equalsnull或addr2==null?谢谢您的回答,我知道您正在做的大部分事情,非常简单,但您能简单地告诉我TextUtils是什么吗?我需要导入它吗?@PootieTang TextUtils是一个实用程序类,它是Android SDK的一部分,因此您不必将其添加到依赖项中。TextUtils是Android文本导入的一部分,用于检查null或空字符串。只需导入android.text.TextUtils;谢谢你的回答,我知道你正在做的大部分事情,非常简单,但是你能简单地告诉我TextUtils是什么吗?我需要导入它吗?@PootieTang TextUtils是一个实用程序类,它是Android SDK的一部分,因此您不必将其添加到依赖项中。TextUtils是Android文本导入的一部分,用于检查null或空字符串。只需导入android.text.TextUtils;也许这是一个单独的问题,但是公共**字符串**部分不保证返回字符串吗?它保证返回的对象将实现字符串接口。这意味着,如果它存在,您可以对所述对象执行String方法。返回的对象可能实际上不存在,但因此为null。如果对象不存在,则无法对其执行操作。Java无法保证返回非null。您必须通过接口保证这一点,因为有时空值是合适的。例如,在这个场景中,您如何知道服务器返回的是null而不是空字符串?您确实会丢失这些信息。但最常见的情况是,您会返回一个默认对象(如空字符串),这样您就不必使用ifobj!=代码中的任何地方都是空的,代码很快就过时了。谢谢你帮助我理解。我现在已经习惯了使用这个解决方案。也许这是一个单独的问题,但公共**字符串**部分不保证返回字符串吗?它保证返回的对象将实现字符串接口。这意味着,如果它存在,您可以对所述对象执行String方法。返回的对象可能实际上不存在,但因此为nul
L如果对象不存在,则无法对其执行操作。Java无法保证返回非null。您必须通过接口保证这一点,因为有时空值是合适的。例如,在这个场景中,您如何知道服务器返回的是null而不是空字符串?您确实会丢失这些信息。但最常见的情况是,您会返回一个默认对象(如空字符串),这样您就不必使用ifobj!=代码中的任何地方都是空的,代码很快就过时了。谢谢你帮助我理解。我现在已经习惯了使用这个解决方案。