0

当我不包含注释行时,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
4

3 回答 3

2

您需要打印 的结果.toString().append()一些内容,以便给它一些要打印的内容。例如:

    prevLineBuffer = new StringBuilder();
    prevLineBuffer.append(inputFileName);
    System.out.print(prevLineBuffer.toString());

要回答你问题的后半部分......

字符串文档

一个字符串池,最初是空的,由 String 类私下维护。[...] 调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,该字符串由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。

来自StringBuilder 文档

一般来说,如果 sb 引用 StringBuilder 的实例,则 sb.append(x) 与 sb.insert(sb.length(), x) 具有相同的效果。每个字符串生成器都有容量。只要字符串构建器中包含的字符序列的长度不超过容量,就不需要分配新的内部缓冲区。如果内部缓冲区溢出,它会自动变大。-

于 2010-02-19T05:39:53.793 回答
1

简而言之,将任何内容的空引用打印到 PrintStream(这是 System.out 是什么)将附加“null”。这是因为 print() 和 println() 方法显式测试 null,使用类似:txt=(obj==null ? "null" : obj.toString());

当您创建 StringBuilder 而不是将其保留为空时,打印的是 StringBuilder 的 toString(),如果您没有添加任何内容,则它是一个空字符串,或者......什么都没有。

于 2010-02-19T07:47:49.523 回答
0

Java 不会为对象静态分配空间。线

StringBuilder prevLineBuffer;

声明对 StringBuilder的引用。在调用构造函数之前,StringBuilder 本身并不存在。因此,您会得到一个 NullPointerException - prevLineBuffer 引用为空。

您的 prevLineBuffer 为空的原因仅仅是您从不向其附加任何内容 - 另请参阅其他回复。

于 2010-02-19T08:23:52.603 回答