在Java中检查空值
我正在尝试修改一个Android应用程序,该应用程序正在从服务器提取一些JSON在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); 发
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!=代码中的任何地方都是空的,代码很快就过时了。谢谢你帮助我理解。我现在已经习惯了使用这个解决方案。