当我不包含注释行时,prevLineBuffer包含“null”。当我包括注释行时,它仍然有效,但打印一个空字符串。 Java是否为声明的字符串静态分配空间,然后为注释行中的其他字符串动态分配空间?两者似乎都有效......
public class Indexer {
String input;
StringBuilder prevLineBuffer;
Indexer(String inputFileName) throws RuntimeException{
input = inputFileName;
//prevLineBuffer = new StringBuilder();
System.out.print(prevLineBuffer);
}//constructor
}//class
答案 0 :(得分:2)
您需要打印.toString()
和.append()
某些内容的结果,以便为其打印一些内容。例如:
prevLineBuffer = new StringBuilder();
prevLineBuffer.append(inputFileName);
System.out.print(prevLineBuffer.toString());
回答你问题的后半部分......
来自String docs:
字符串池(最初为空)由String类私有维护。 [...]当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。
通常,如果sb引用StringBuilder的实例,则sb.append(x)与sb.insert(sb.length(),x)具有相同的效果。每个字符串构建器都有容量。只要字符串生成器中包含的字符序列的长度不超过容量,就不必分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。 -
答案 1 :(得分:1)
简而言之,将任何内容的空引用打印到PrintStream(这是System.out的内容)将追加“null”。这是因为print()和println()方法显式测试null,使用类似:txt=(obj==null ? "null" : obj.toString());
当您创建StringBuilder而不是将其保留为null时,打印的是StringBuilder的toString(),如果您没有添加任何内容,则为空字符串,或者......没有。
答案 2 :(得分:0)
Java不会静态地为对象分配空间。这条线
StringBuilder prevLineBuffer;
向StringBuilder声明引用。在调用构造函数之前,StringBuilder本身不存在。因此,您将获得NullPointerException - prevLineBuffer引用为null。
你的prevLineBuffer为空的原因只是你从不向它添加任何内容 - 另见其他回复。