【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#的字符串处理的习惯,需要注意!!!

如果本文对你有所帮助,欢迎赞赏~~~

欢迎关注微信公众号:Unity游戏开发笔记
在这里插入图片描述
QQ群:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/onelei1994/article/details/104698951
今日推荐