有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓在Java中检查空值

我正在尝试修改一个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());

这一切都有效,除了当服务器返回nullfor address2时,在这种情况下,文本文本“null”将打印在文本视图中,其中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,如果可以,请提供参考资料


共 (6) 个答案

  1. # 1 楼答案

    String addr2 = mSponsor.getAddress2();
    if(!TextUtils.isEmpty(addr2) || !addr2.equalsIgnoreCase("null")
         txtAddress.setText(mSponsor.getAddress1() + "\n" + addr2);
    else
         txtAddress.setText(mSponsor.getAddress1());
    
  2. # 2 楼答案

    为你的getter代码试试这个:

     public String getAddress2() {
        if (Address2.equals("null")) {
            Address2="";
        }
        return Address2;
     }
    

    当然,对于Address1,你也可以对你的另一个getter做同样的事情。 此外,如果要检查空字符串,请使用Address2.length() == 0而不是Address2 == ""

  3. # 3 楼答案

    你不应该使用:

    if((addr2 == "null")
    

    用于字符串比较:

    if (addr2.equalsIgnoreCase("null"))
    
  4. # 4 楼答案

    这个怎么样

    // 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);
    
  5. # 5 楼答案

    您可以在Sponsor类中创建另一个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.setText(mSponsor.getFormattedAddress());

  6. # 6 楼答案

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

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

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

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