объявление Java-буфера - PullRequest
       27

объявление Java-буфера

0 голосов
/ 19 февраля 2010

Когда я не включаю закомментированную строку, prevLineBuffer содержит «ноль». Когда я включаю закомментированную строку, она все еще работает, но печатает пустую строку. Распределяет ли Java статически место для объявленной строки, а затем динамически выделяет пространство для дополнительной строки в закомментированной строке? Оба, кажется, работают ...

public class Indexer {
    String input;
    StringBuilder prevLineBuffer;

    Indexer(String inputFileName) throws RuntimeException{
        input = inputFileName;
        //prevLineBuffer = new StringBuilder();
        System.out.print(prevLineBuffer);

    }//constructor
}//class

Ответы [ 3 ]

2 голосов
/ 19 февраля 2010

Вам нужно напечатать результат .toString() и .append() что-то для него, чтобы дать ему что-то для печати.Например:

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

Чтобы ответить на вторую половину вашего вопроса ...

Из Строка документов :

Aпул строк, изначально пустой, поддерживается частным образом классом String.[...] Когда вызывается метод intern, если пул уже содержит строку, равную этому объекту String, как определено методом equals (Object), возвращается строка из пула.В противном случае этот объект String добавляется в пул и возвращается ссылка на этот объект String.

Из документов StringBuilder :

В общем случае, если sb ссылается на экземпляр StringBuilder, то sb.append (x) имееттот же эффект, что и sb.insert (sb.length (), x).У каждого строителя строки есть способность.Пока длина символьной последовательности, содержащейся в построителе строк, не превышает емкости, нет необходимости выделять новый внутренний буфер.Если внутренний буфер переполняется, он автоматически увеличивается.-

1 голос
/ 19 февраля 2010

Короче говоря, при печати пустой ссылки на что-либо в PrintStream (то есть, что такое System.out) добавится «null». Это связано с тем, что методы print () и println () явно проверяют нулевое значение, используя что-то вроде: txt=(obj==null ? "null" : obj.toString());

Когда вы создаете StringBuilder вместо того, чтобы оставить его пустым, то печатается функция toString () StringBuilder, которая, если вы ничего не добавили, является пустой строкой или ... ничем.

0 голосов
/ 19 февраля 2010

Java статически не выделяет пространство для объектов.Строка

StringBuilder prevLineBuffer;

объявляет ссылку на StringBuilder.Сам StringBuilder не существует до того, как вы вызовете конструктор.Таким образом, вы получаете NullPointerException - ссылка prevLineBuffer равна нулю.

Причина, по которой ваш prevLineBuffer пуст, заключается в том, что вы никогда не добавляете к нему никакого содержимого - смотрите также другие ответы.

...