如何分析Android SDK中String的坑
本篇文章给大家分享的是有关如何分析Android SDK中String的坑,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
Android SDK中String的坑
最近一直在查项目中一个SDK相关的bug,我们通过C#代码给java层传入一个string,然后在java层解析出对应的json数据。在使用JSONObject的时候抛出了一个异常"System.err: org.json.JSONException: End of input at character 0 of"。
public void Sample(String json)
{
JSONObject jsonObj;
try
{
jsonObj = new JSONObject(json);
}
catch (JSONException e)
{
QLog.Log(e.toString());
return;
}
QLog.Log(json.toString());
}
最终我们定位到是上面代码的
jsonObj = new JSONObject(json);
既然出了问题,我们就做了一个安全判断,在传入null或者空串“”的时候跳过执行。于是就有了下面这个代码。
if(json == null || json == "")
{
QLog.Log("json is null or empty.");
return;
}
但是我们运行代码,发现该行代码并没有被执行到。仍然走到了Json解析的地方,并且抛出了异常。我们在C#层打了log,发现传入的值就是空串“”。但是java层判断空串“”却没有执行到。因此果断搜了java层string的判断接口。终于让真相浮出了水面。
下面是java层string的比较结果。
字符串s1==null,s1不指向堆中任何内存空间,返回true
字符串s1==s2,s1和s2内容一样且s1和s2的内存地址一样,返回true
字符串s1.equals(s2),s1和s2的内容一样,返回true
字符串s1.isEmpty(),s1的长度为0,返回true(String s1=""; s1.isEmpty()是true
C#层判断两个字符串是否相等,其实大部分都是直接用==来判断值是否相等的。如果要判断内存地址是否相等是需要调用ReferenceEquals判断的。
string.ReferenceEquals(s1,s2);
也就是说C#是通过==来判断值相等,通过ReferenceEquals来判断内存地址是否相等。
但是java是通过equal来判断值相等,通过==来判断内存地址是否相等。
平时我们用惯了C#的写法,这里就想当然的用来C#的字符串处理的习惯,需要注意!!!
以上就是如何分析Android SDK中String的坑,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。