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


80

在我的Android应用程序中,我无法使用JDK 1.6中的String.isEmpty()函数。Android 2.1 lib在java.lang.String类中没有此功能

我尝试将JRE系统库输入到我的项目中,因为它具有此功能,但是没有效果。

如何解决此问题并允许我的应用程序使用此功能?


11
是的isEmpty在API级别9.看到添加这里developer.android.com/reference/java/lang/...
Mudassir

3
奇怪,我没有遇到这个问题。我确实避免使用.isEmpty()。我只是想使用if(myString == null || myString.trim()。size()== 0)
阿里

1
@Ali-啊!听起来您正在处理的代码在指定和检查其API /接口的前置条件和后置条件方面做得不好。
斯蒂芬·C

顺便说一句,您甚至可以告诉JavaC编译与JRE关节版本兼容的代码。我从未尝试过,但是我想知道在这种情况下这是否会是更简单的解决方案。@Stephen:我们的软件架构师专门告诉我,当从api调用接收到值时,始终检查null。同样,在用户输入时,我们经常会出现不一致的情况,如果字段为空,则前端可以返回null;如果用户将字段聚焦但未键入任何内容,则前端可以返回空字符串。奇怪,我知道。
阿里

2
@Ali-我对您的建筑师没有印象。IMO,最好在源头而不是在每个API处检测和处理空值。除此之外,将意外的空值视为错误,并使其转化为NPE。显式测试null的麻烦在于,您的代码中充斥着毫无意义的检查,并且您可能陷入将空值转换为空字符串(例如)而“修复” null的陷阱。
Stephen C

Answers:


83

如何解决此问题并允许我的应用程序使用此功能?

你不能

使用String.length() == 0代替。它一直向下兼容JDK 1.0 ...以及J2ME。

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


您确定没有办法配置Eclipse以将其从确定的库中放入代码类吗?

如果您希望您的应用程序在真实的Android设备上运行,则不会。Java / Android平台有意使您难以修改核心类库的行为。首先,您只能通过修改等效于bootclasspath或rt.jar文件的Davlik来完成此操作,而在运行中的JVM中都无法完成这些操作。

那种修修补补的有风险的潜在破坏Java的其他应用程序。即使假设您不能直接破坏Android应用程序的分离(由于下面提到的进程/ uid分离),对(共享的)Java核心类的恶意调整仍可能会允许一个应用程序干扰或窃取另一应用程序的信息。


问题是,我使用JSONRPC,使用免费库code.google.com/p/json-simple中的类,并且有一个函数JSONRPC2Message.parse(String arg0),该函数使用String.isEmpty()方法,因此当我运行我的应用程序,但出现java.lang.noSuchMethodError异常。您确定没有办法配置Eclipse以将其从确定的库中放入代码类吗?我的意思是说我想使用String类不是来自Android 2.1库,而是来自JRE System库?
teoREtik 2011年

7
Json-simple是开源的;创建您自己的不使用String.isEmpty()的库版本。这比尝试改编android运行时库要简单(且安全)得多。
thoredge 2011年

如果他们不这样做,那么恶意应用破坏安全性将是微不足道的-我真的对此表示怀疑。每个应用程序均在其自己的uid下在单独的Linux进程中运行,而Android安全性不依赖Java程序包保护。如果一个应用程序修改了自己的副本String,则对其他应用程序无效。
poolie 2012年

@poolie-好的,但是运行该应用程序的“ JVM”中没有沙箱吗?(我很难相信,Linux级别的安全性是您针对Android手机上运行的恶意应用程序提供的唯一保护。)
Stephen C



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
我认为这应该是选择的答案。Usint TextUtils是最佳选择。您不必创建自己的函数即可实现相同功能。
Genaut

你知道你可能刚刚写的return (str == null || str.length() == 0);吧?
皮奥韦赞

@Piovezan是的,我们也可以写这篇文章
Shan Xeeshi


1

“” .equals(yourString); 还给出了类似String.isEmpty()的行为;


实际上,这是最好的解决方案,因为它还可以防止NullPointerException
Lukas 2015年

这不是最佳解决方案,因为每次要比较时都会创建一个新的String对象,而使用isEmpty的对象则检查null和length。
Genaut

2
@ user1422434-不,你不是。只有一个对象代表整个VM的空字符串文字。
Stephen C

但我也不同意@Lukas。通常,“预防NPE”的解决方案是一个坏主意。一个更好的主意是找出意外null的来源,并解决该问题"".equals(yourString)仅当的nullyourString有意义且预期时,该方法才是一个好的解决方案。
史蒂芬·C

-4

您必须将android API升级到9级,或者使用String.trim().length()==0String.equals("")替代,它应该适用于您的android API级别和您的JDK版本。


什么?字符串" "不为空!为什么建议修剪弦线?
ruX

1
@ruX" ".trim()将为空!!!你甚至知道吗?如果您不了解我的描述,请不要评价!!!
发动机Bai

@Eugenie BaiString.trim().length()==0String.equals("")在时返回不同的结果String = " "。第二个片段是正确的
RUX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.