虽然构建字符串让我很困惑。如果我这样做:
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 =“”;我已经初始化了一个不应该......的变量。
为什么这样做的“正确”是什么?
答案 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。