2010-02-20 67 views
2

我有線條的下列順序代碼:當我在Java中聲明它時,我應該爲變量賦值嗎?

Socket echoSocket = null; 
... something ... 
echoSocket = new Socket("taranis", 7); 

我不明白爲什麼我們希望有一個第一線。那麼我知道Java無法從它的值中定義一個變量的類型。這就是爲什麼我們首先需要說明echoSocket是具有Socket類型(第一行)的變量,而echoSocket具有特定值(類Socket的對象)的高度。

但我不明白的是爲什麼我們需要分配一個值兩次?我們爲什麼要說echoSocket等於null?

+2

你不需要做兩次,你需要做它之前做任何事情,除了一項任務。 – Fredrik 2010-02-20 18:53:46

回答

2

你不需要爲其分配一個值給本地變量是不使用的。代碼應該生成直到必要時才聲明變量。 JLS中有一個有點沉悶的章節。

您的問題似乎與嘗試塊。資源處理應該寫成:

acquire(); 
try { 
    use(); 
} finally { 
    release(); 
} 

在這種情況下:

final Socket echoSocket = new Socket("taranis", 7); 
try { 
    ... something ... 
} finally { 
    echoSocket.close(); 
} 

捕獲的異常應該去各地不少。不要試圖保存在嘗試塊。

如果您發現自己重複了很多樣板,請嘗試執行周圍成語。

1

爲什麼你聲明變量的時間早於你對它有用的值呢?有時這是必要的,如果它要在兩個不同的分支進行分配,但一般最好是等到你有一個值,並聲明在一個聲明中分配:

Socket echoSocket = new Socket("taranis", 7); 
+0

我有一個想法(不知道它是否好)。也許作業並不總是成功?我們試圖在「try」塊中使用「new Socket」(爲echoSocket設置一個值),並且我們假設echoSocket有一個值。但是沒有保證「新插座」的工作。所以最好在try塊中的賦值之前給echoSocket賦值。只是爲了確定一個價值。 – Roman 2010-02-20 19:07:18

+0

@Roman:如果套接字構造函數失敗了,你是否可以繼續使用你的方法? *排序*的情況是分配null的原因之一,但通常我發現我希望異常立即被重新拋出。 – 2010-02-21 07:30:40

1

你並不需要給echoSocket null的值。 (你在哪裏讀的?)

您可與

Socket echoSocket; 
... something ... 
echoSocket = new Socket("taranis", 7); 

去或做在同一行

... something ... 
Socket echoSocket = new Socket("taranis", 7); 

希望它可以幫助..

+0

我從這裏得到了代碼:http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html – Roman 2010-02-20 19:01:41

5

我使用的一般原則是:儘可能晚地聲明一個變量。

沒有爲不但是初始化變量一個非常有用的情況:

String someString; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    someString = "bar"; 
} 

因爲someString是未初始化的聲明如果說,在else條款沒有設置值的Java編譯器會抱怨未初始化值。如果你這樣做,情況就不會如此:

String someString = null; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    // do nothing 
} 

這是一個很好的理智檢查。以上不是編譯錯誤,但是這是:

String someString; 
if (/* some condition */) { 
    someString = "foo"; 
} else { 
    // do nothing 
} 
0

技術編寫者並不總是編寫最好的代碼。

個人而言,我只在編譯器告訴我時寫入初始值。

相關問題