成都网站建设设计

将想法与焦点和您一起共享

如何分析AndroidSDK中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的坑,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。


网站名称:如何分析AndroidSDK中String的坑
浏览路径:http://chengdu.cdxwcx.cn/article/pjejgg.html