虽然构建字符串让我感到困惑。如果我这样做:
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 的字符串生成器给了我:“这个 var 此时只能为 null NPE”
说真的,它就像一把海锯,将其保留为“String webreponse”,然后我得到编译器错误,放入“String webreponse = null”我在字符串中得到null并放入String webreponse =“”;我已经初始化了一个不应该的变量...
这样做的“正确”理由是什么?
最佳答案
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();
}
关于java - Android Build Strings 让我抓狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21541836/