Android Build Strings让我很生气

时间:2014-02-04 02:21:17

标签: java android string

虽然构建字符串让我很困惑。如果我这样做:

String line;
String webreponse ;
while ((line = reader.readLine()) != null) {
     webreponse = webreponse + line;
} // while reader != null

Eclipse说:“本地变量webreponse可能尚未初始化”并让我这样做:

String line = null;
String webreponse = null ;
while ((line = reader.readLine()) != null) {
      webreponse = webreponse + line;
} // while reader != null

但是,我最终得到:“添加了nullSome Strings”添加了NULL。当然如果我改变String webreponse =“”;空字符串它可以工作但是,这通常是一个糟糕的方法,因为我刚刚初始化var webresponse它不应该是(并且以后不能检查null)!

当然我也尝试过使用字符串构建器和类似但是,初始化为null的字符串构建器给了我:“此时此变量只能为空NPE”

说真的,它就像一个海锯,留下它作为“String webreponse”,我得到编译器错误,输入“String webreponse = null”我在我的字符串中得到null并放入String webreponse =“”;我已经初始化了一个不应该......的变量。

为什么这样做的“正确”是什么?

2 个答案:

答案 0 :(得分:3)

Java中的字符串是不可变的。每次使用连接运算符(+)时,实际上都是在创建一个新的String对象。

因为您从String开始null开始...连接期间的转换会在结果中生成单词“null”(这在使用字符串连接时在JLS中指定)。

可能只是以空String开头(例如String webresponse = ""),但由于前面提到的不变性,这仍然是非常低效的。

您想使用StringBuilder

String line;
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null) {
      sb.append(line);
}

修改

我刚注意到:“这通常是一种糟糕的方法,因为我刚刚将var webresponse初始化时它不应该是(并且以后不能检查为null)!”

String确实提供了.isEmpty()方法......所以我不知道null给你带来了什么好处,但你可以简单地检查StringBuilder的长度

String webresponse = null;
if (sb.length() > 0)
{
    webresponse = sb.toString();
}

答案 1 :(得分:0)

在java中,您必须为局部变量赋予默认值。局部变量是在方法中定义的那些变量。因此,您需要使用默认值初始化本地变量。您已使用Null定义。所以当你连接这个时。它会添加“Null”+您的其他值。为避免这种情况,您可以使用空字符串e.q String ab =“”;

初始化您的局部变量

其次你使用String来连接是错误的。您正在创建大量的String对象。相反,您可以使用StringBuilder或StringBuffer。如果您不担心同步,正确的方法是使用StringBuilder。