无法在Android中调用String.isEmpty()方法

80
在我的 Android 应用程序中,我无法使用位于 JDK 1.6 中的 String.isEmpty() 函数。 Android 2.1 lib 中的 java.lang.String 类没有此函数。
我尝试将 JRE 系统库输入到我的项目中,因为它具有此功能,但没有效果。
如何解决这个问题并允许我的应用使用此函数?

11
isEmpty方法是在API Level 9中添加的。请参考这里http://developer.android.com/reference/java/lang/String.html#isEmpty%28%29。 - Mudassir
3
奇怪,我还没有遇到过这个问题。虽然我确实避免使用 .isEmpty(),但我更喜欢使用 if(myString == null || myString.trim().size() == 0)。 - Ali
1
@Ali - 哎呀!听起来你所工作的代码在指定和检查其API / 接口前置条件和后置条件方面做得不好。 - Stephen C
顺便提一下,您甚至可以告诉JavaC编译代码以与特定版本的JRE兼容。我从未尝试过,但我想知道在这种情况下是否会是更简单的解决方案。@Stephen:我们的软件架构师明确告诉我,当从API调用接收到值时,始终要检查空值。此外,对于用户输入,我们经常遇到不一致的情况,即如果字段为空,则前端可能返回null,如果用户聚焦该字段但没有输入任何内容,则返回空字符串。奇怪,我知道。 - Ali
2
@Ali - 我对你的架构并不印象深刻。在我看来,最好的做法是在源头检测和处理空值,而不是在每个API中进行处理。除此之外,将意外的空值视为错误并让它们转化为NPEs。明确测试空值的问题在于你的代码会被无意义的检查所淹没,并且你可能会陷入“修复”空值的陷阱,例如将它们转换为空字符串。 - Stephen C
7个回答

120

你可以使用 android.text.TextUtils.isEmpty() 方法代替。该方法也会检查字符串是否为空并且自 API level 1 就可用。

if (TextUtils.isEmpty(str)) {
    Log.d(TAG, "String is empty or null!");
}

83

我该怎么解决这个问题并允许我的应用程序使用这个函数?

你不能。

改用String.length() == 0。它向后兼容到JDK 1.0 ... 并且也与J2ME兼容。

String.equals("")是另一种选择。


您确定没有办法配置Eclipse从确定的库中添加代码类吗?

如果您想让您的应用程序在真实的Android设备上运行,那就不行。Java / Android平台有意使您很难玩弄核心类库的行为。首先,您只能通过修改Davlik启动的bootclasspath或rt.jar文件来实现,而这两者都无法在正在运行的JVM内完成。

这种玩弄的风险可能会破坏其他应用程序的Java。即使考虑到您不能直接威胁Android应用程序分离(因为下面提到的进程/ uid分离),恶意调整(共享的)Java核心类仍然可能允许一个应用程序干扰或窃取信息来自另一个应用程序。


问题是,我使用来自免费库http://code.google.com/p/json-simple/的类与JSONRPC一起工作,并且有一个函数JSONRPC2Message.parse(String arg0),它使用String.isEmpty()方法,因此当我运行我的应用程序时,我会得到java.lang.noSuchMethodError异常。您确定没有办法配置Eclipse将代码类放入特定库中吗?我的意思是,如果我想使用JRE系统库中的String类而不是Android 2.1库中的String类,是否可以实现? - teoREtik
7
Json-simple 是开源的;创建一个自己的库版本,不使用 String.isEmpty() 方法。这比尝试适配 Android 运行库要简单得多(也更安全)。 - thoredge
如果它们没有这样做,一个流氓应用程序就很容易破坏安全性。但我非常怀疑这一点。每个应用程序在自己的uid下运行一个独立的Linux进程,并且Android安全不依赖于Java包保护。如果一个应用程序修改了自己的String副本,则对其他应用程序没有影响。 - poolie
4
@StephenC Diane Hackborn(高级Android工程师)写道:“我们不认为虚拟机是一个安全屏障,浏览器就是这样的一个很好的例子——绝大多数浏览器(以及容易出现安全漏洞的部分)都在WebKit中,这是一个本地的C++库。我们平台的主要安全屏障是通过进程/UID分离来实现的,由内核强制执行,因此应用程序中的本机代码与Java代码一样安全。”无论如何,内核保护非常强大,还有市场保护。 - poolie
对,也许吧。但底线是:1)Java和Android确实试图使应用程序无法更改(例如)String类型,2)这确实减少了恶意软件尝试访问您的数据等方式的数量。仅出于应用程序员方便而移除此层保护是不负责任的...在我看来。 - Stephen C
显示剩余3条评论

6

这个方法在API9中出现,因此您不能在Android2.3之前使用它。


5
你可以使用这个TextUtils.isEmpty(str)。这是从API级别1就可用的,或者你可以像下面这样创建自己的方法。
public boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

2
我认为这应该是被选中的答案。使用TextUtils是最好的选择。你不必创建自己的函数来完成相同的任务。 - Genaut
你知道你本可以只写成 return (str == null || str.length() == 0);,对吧? - Piovezan
@Piovezan 是的,我们也可以写这个。 - Zeeshan

4
据我所知,Android支持Java 5,因此没有isEmpty();方法可用。您可以使用length()方法来模拟isEmpty()的效果。

1

"".equals(yourString); 也可以像 String.isEmpty() 一样产生相同的行为。


这实际上是最好的解决方案,因为它还可以防止NullPointerException。 - Lukas
这不是最好的解决方案,因为每次想要比较时都会创建一个新的字符串对象,而使用isEmpty则可以检查null和长度。 - Genaut
2
@user1422434 - 不,你不是。整个 VM 中只有一个表示空字符串字面量的对象。 - Stephen C
但我也不同意@Lukas的观点。通常来说,“防止NPE”的解决方案是一个坏主意。更好的想法是找出意外的“null”值来自哪里,然后解决那个问题。如果yourStringnull值是有意义的...并且是预期的,那么"".equals(yourString)方法才是一个好的解决方案。 - Stephen C

-4

你需要将 Android API 升级到 9 级,或者使用 String.trim().length()==0String.equals("") 替代,这样可以适用于你的 Android API 级别和 JDK 版本。


什么?字符串" "不是空的!为什么你建议修剪字符串? - ruX
1
@ruX 如果你不知道 " ".trim() 会变成空字符串,那就别乱评分!!!如果你不理解我的描述,请不要给差评!!! - Engine Bai
@Eugenie Bai String.trim().length()==0String.equals("")String = " "时返回不同的结果。第二个代码段是正确的。 - ruX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接