2010-02-19 75 views
0

當我不包含註釋行時,prevLineBuffer包含「null」。當我包括註釋行時,它仍然有效,但打印出一個空字符串。 Java是否靜態地爲聲明的字符串分配空間,然後爲註釋行中的附加字符串動態分配空間?同時出現工作...java stringbuffer聲明

public class Indexer { 
    String input; 
    StringBuilder prevLineBuffer; 

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

    }//constructor 
}//class 

回答

2

您需要打印結果的.toString(),並.append()東西吧,爲了給它的東西打印。例如:

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

要回答你的問題的後半部分......

String docs

串,初始爲空池,由String類私人維護。 [...]調用intern方法時,如果池已經包含與equals(Object)方法確定的String對象相等的字符串,則返回池中的字符串。否則,將此String對象添加到池中,並返回對此String對象的引用。

StringBuilder docs

一般來說,如果某人是指一個StringBuilder的一個實例,則sb.append(x)具有作爲sb.insert相同的效果(sb.length() , X)。每個字符串生成器都有一個容量。只要包含在字符串構建器中的字符序列的長度不超過容量,就不需要分配新的內部緩衝區。如果內部緩衝區溢出,它會自動變大。 -

1

簡而言之,向PrintStream(這是System.out是什麼)打印任何內容的空引用將會附加「null」。這是因爲print()和println()方法明確地使用類似如下方式測試null:txt=(obj==null ? "null" : obj.toString());

當您創建StringBuilder而不是將它留空時,所打印的是StringBuilder的toString(),如果您有添加什麼都不是空字符串,或者什麼也不是。

0

Java不爲對象靜態分配空間。行

StringBuilder prevLineBuffer; 

聲明一個參考到一個StringBuilder。在調用構造函數之前,StringBuilder本身不存在。因此你得到一個NullPointerException - prevLineBuffer引用爲null。

你prevLineBuffer爲空的原因就是你永遠不會追加任何內容 - 參見其他答覆。