2010-04-26 184 views
1

好吧,這只是一個黑暗中的鏡頭,但它可能是導致大部分錯誤獲得的原因。初始化變量的正確方法

當你初始化的東西。可以說一個小型的揮杆計劃。它會是這樣的

variables here 
{ 
    private Jlist contactList; 
    String [] contactArray; 
    ArrayList <String> contactArrayList; 
    ResultSet namesList 


// constructor here 

public whatever() 
{ 
    GridLayout aGrid = new GridLayout(2,2,10,10); 

    contact1 = new String(); 
    contact2 = new String(); 
    contact3 = new String(); 

    contactArrayList = new ArrayList<String>(); 

// is something supposed too go in the() of this JList? 
    contactList = new JList(); 

    contactArray = new String[5]; 

    from1 =new JLabel ("From: " + contactArray[1]); 



gridlayout.add(components)// theres too many components to write onto SO. 

} 


// methods here 

public void fillContactsGui() 
{ 
    createConnection(); 
ArrayList<String> contactsArrayList = new ArrayList<String>(); 

    while (namesList.next()) 
    { 
     contactArrayList.add(namesList.getString(1)); 
     ContactArray[1] = namesList[1]; 
    } 
} 

我知道這可能是一個龐大的初學者的問題,但是這是得到的代碼IVE太習慣。即時初始化三四次沒有意義,因爲我不知道他們在哪裏gp。任何人都可以對此有所瞭解嗎?

p.s.對於混亂的示例代碼感到抱歉。我盡力了。


確定這裏有一點更清楚。

代碼的總體佈局是什麼我問。

我的代碼格式化爲這樣。

變量; 構造函數; 方法;

,我會是正確的說法應該是這樣的

public class test 
{ 
    int i; 

    public test() 
    { 
    i = 0; 
} 

    public void addi() 
    { 
    i = i +1; 
    } 
} 

,而不是像這樣

public class test 
{ 
    int i = 0; 

    public test() 
    { 
    int i = 0; 
    } 


    public void addi() 
    { 
    int i = i +1; 
    } 
} 

IM試圖找出初始化變量的正確方法。因爲即時定義他們每次我使用它們

+0

你的問題對我來說不是很清楚。什麼是你收到的錯誤信息? – CoolBeans 2010-04-26 16:25:21

+0

這是你的代碼或只是一個片段?很難看到你的代碼實際上在做什麼,因此我們很難幫助你。 – 2010-04-26 16:28:03

+0

你是問「這是否會像這樣」,而不是一個特定的方式,或只是一般?如果只是一般情況下,這些問題之一是沒有更多信息就無法回答的問題;沒有一個正確的方法來初始化每個程序。 – Pops 2010-04-26 16:36:17

回答

1

您應該儘可能快地初始化變量 - 只要初始值已知。取而代之的

ArrayList<String> contactArrayList; 

考慮這個

static final int INITIAL_LIST_SIZE = 100; 
List<String> contactArrayList = new ArrayList<String>(INITIAL_LIST_SIZE); 

下面是類變量,實例變量,或數組元素default values列表。

附錄:它通常皺眉重複默認的初始化。在後面的示例中,默認初始化將i設置爲零。

勘誤:注意在test構造函數,隱藏場修正關於int i = 0評論。

public class test { 

    int i = 0; // superfluous, "int i;" is enough 

    public test() { 
     int i = 0; // hides field i 
    } 

    public void addi() { 
     int i = i + 1; // hides field i; won't increment field i 
    } 
} 
+0

@trashgod越快越好。好的,我可以理解這一點。 ID在頂部定義我的變量並初始化它。但讓我說,我不知道它是什麼,直到該方法。我將如何寫它。我會在頂部創建一個變量,將它從構造函數中取出並放入方法中?一個例子會很棒。 – OVERTONE 2010-04-26 16:50:28

+0

常量INITIAL_LIST_SIZE只是一個最佳估計值。如果沒有更好的猜測,你會依賴默認構造函數的值10,'new ArrayList ()'。 http://java.sun.com/javase/6/docs/api/java/util/ArrayList.html – trashgod 2010-04-26 17:00:53

+1

「我將如何寫它,我會在頂部創建一個變量,讓它離開構造函數,並把它它的方法?「究竟。那麼你只需要小心,在初始化之前你永遠不會嘗試訪問變量。正如約翰D所說,這有點不尋常。通常,對象中的所有變量都將在構造函數中初始化,或者僅在「變量部分」中內聯,即使它們已初始化爲空列表或空映射。 – MatrixFrog 2010-04-26 17:03:02

1

沒有初始化事情的唯一問題是你讓自己打開空指針異常。理想情況下,您應該在構造函數中初始化您需要的所有內容,以確保其他方法都可以使用。另一種方法是在調用方法之前檢查是否爲空(例如if (list != null && list.size() > 0)

2

由於不同的原因,變量可以在不同的位置進行初始化。例如,在您的示例代碼中,您總是將您的聯繫人列表初始化爲新的JList。這可以在「變量在這裏」部分作爲private JList contactList = new JList()完成。

您的contactArrayList看起來像通常基於傳入構造函數的參數,所以應該在構造函數中將這些項添加到它中。如果你採用這種方法,contactArrayList應該被聲明爲final。這將強制所有構造函數初始化列表。 (如果你不想最終聲明它,你可能想要在聲明時使用聯繫人列表的處理方式初始化它。)

偶爾,字段不能(或不應該)被初始化,直到該類的實例已構建。在這些情況下,您必須非常小心地訪問和使用該字段,以確保它未在未初始化狀態下使用。

0

你最後一個例子 - 「public test(){int i = 0; }「可能不會按預期工作,通過在test和addi中重新聲明變量」int「,現在有三個名爲」i「的變量:成員變量定義在頂部,局部變量在測試中,另一個局部變量在addi中,成員值不會被任何一個函數改變

我肯定會避免使用虛擬值初始化變量,比如你的「contact1 = new String()」,是的,這可以防止你得到編譯錯誤對於未初始化的變量或者可能拋出一個空指針異常,但是如果沒有這個就得到一個錯誤,那就意味着你沒有給變量賦一個實際值,設置這個虛擬值並不能解決問題,它只是隱藏它就像是將磁帶放在儀表板上的警告燈上:是的,你再也看不到警告了,但這不是因爲問題已修復,只是因爲你已經覆蓋了它向上。

確實有些情況下可以設置一個默認值,然後也許你會用其他值替換它,也許你不會。我不是說這是一個不好的做法。我在說,如果你得到了單位變量的錯誤,不要盲目地將它們初始化爲無意義的東西。找出爲什麼他們沒有價值並解決真正的問題。

除此之外,我不知道該怎麼說你的例子。我不確定你想要完成什麼。您有名爲contact1,contact2和contact3的變量看起來永遠不會使用。 contactArray顯然應該由fillContactsGui填充,但我沒有看到它曾經被調用過的地方。我不確定這些在你的邏輯中是否有缺陷,或者這只是一個不完整的例子。

至於初始化和使用數據的一般正確的方法:

如果一個變量可以是本地的,使它局部。在這種情況下,理想情況下在聲明它時進行初始化。像:

public void foobar() 
{ 
    ... do some stuff ... 
    int i=0; 
    ... do other stuff ... 
    i=i+j; 
    ... etc ... 
} 

我會避免界定它,然後以後如果有可能對其進行初始化,因爲這將創建一個你無法初始化它的可能性。當然,如果它可能以兩種不同的方式初始化,這是很難避免的。像:

public void foobar() 
{ 
    int i; 
    if (plugh>0) 
    i=plugh; 
    ... bunch more logic ... 
    // Inside some IF so we won't even get here if i was set earlier 
    if (zork==true) 
    i=shambar; 
    ... etc ... 
} 

儘管如此,你可以把它放在一起越好,越好。