Android文件夹导航问题:currentPath与rootPath比较失效如何修复?
问题根源与解决方案
这问题我太熟了——你踩了Java字符串比较的经典坑!if(currentPath != rootPath)这个判断完全失效的核心原因,是你用了引用比较而非内容比较。
为什么判断会失效?
在Java里,==和!=比较的是两个字符串对象的内存引用地址,不是它们的实际内容。你初始化的rootPath是一个独立的字符串对象,而用户导航过程中生成的currentPath(哪怕内容和rootPath完全一致),是另一个新创建的字符串对象。两者的引用地址不一样,所以currentPath != rootPath会永远返回true,你的判断逻辑自然完全不起作用。
怎么修复?
把字符串比较方式换成内容比较就行,这里有三种靠谱的写法:
直接用
equals()方法(最常用):if (!currentPath.equals(rootPath)) { // 你的导航逻辑 }注意:如果
currentPath有可能为null,这种写法会抛出NullPointerException。常量前置的
equals()(避免空指针):
把固定的rootPath放在前面,这样哪怕currentPath是null,也不会报错:if (!rootPath.equals(currentPath)) { // 你的导航逻辑 }用
Objects.equals()(Java 7+ 推荐):
这个方法会自动处理空值情况,不用额外判断:import java.util.Objects; // ... if (!Objects.equals(currentPath, rootPath)) { // 你的导航逻辑 }
验证方法(帮你确认问题)
你可以在Logcat里加两行日志,直观看到差异:
Log.d("PathDebug", "rootPath hashCode: " + rootPath.hashCode()); Log.d("PathDebug", "currentPath hashCode: " + currentPath.hashCode()); // 内容相同的字符串hashCode一致 Log.d("PathDebug", "rootPath identity hash: " + System.identityHashCode(rootPath)); Log.d("PathDebug", "currentPath identity hash: " + System.identityHashCode(currentPath)); // 引用不同的话,这里的数值会不一样
本质上你之前的try-catch只是在掩盖问题,现在修复了字符串比较逻辑,就能彻底解决导航越界的问题啦。
内容的提问来源于stack exchange,提问作者user2032396
相关产品推荐
相关产品推荐

