2014-09-04 78 views
1

請原諒我提出一個非常基本的問題,我剛剛開始學習Java,而對我來說一些東西沒什麼意義。我正在研究一些簡單的練習題,然後我碰到這個問題:Java錯誤;無法解析變量名稱

給定一個字符串,我們會說前面是字符串的前3個字符。如果字符串長度小於3,那麼前面就是任何地方。返回前面3個副本的新字符串。

Here is the link對任何有興趣的人。這看起來不難,所以我寫了這個;

public String front3(String str){ 
    if (str.length() < 3){ 
    String front = str; 
    } else { 
    String front = str.substring(0, 3); 
    } 
    return front + front + front; 
} 

這不能運行。相反,它給出了一個例外,說名稱front無法解決。什麼?爲什麼會發生這種情況,無論是String front在if塊還是else塊中都被初始化,嚴格來說Pythonic編碼器都是沒有意義的。示例代碼展示瞭如何將行String front;作爲第二行來初始化一個空字符串。

底下會發生什麼,會導致這不工作在Java?試着用Pythonista能理解的方式來解釋它! :)

另外,我認爲我會被低估爲遺忘,因爲我確定這是一個很多初學者遇到的常見問題,並且可能已經有了一個答案。

+0

您需要了解變量範圍。 – Haris 2014-09-04 23:31:36

回答

4

聲明變量的作用域限於它所在的塊,所以front一旦初始化就立即超出作用域。

對於if語句,在任何{}甚至{}內聲明的任何局部變量在{}之外都不可見。

if之前聲明它,因此它在方法持續時間內保持在範圍內。

String front; 
if (str.length() < 3){ 
    front = str; 
} else { 
    front = str.substring(0, 3); 
} 
+1

哇,這對我來說很奇怪。所以我認爲這適用於Java中的任何塊? – user3002473 2014-09-04 23:29:55

+2

沒錯。任何'{}'內聲明的任何局部變量,甚至'if'語句的'{}'在這些'{}'之外都是不可見的。 – rgettman 2014-09-04 23:31:17

+1

@rgettman您應該在您的答案中包含該評論作爲代碼示例的前體。非常簡潔的答案,以及一個很好的問題。 – rfoo 2014-09-04 23:35:07

1

初始化if以外的變量。

public String front3(String str){ 
    String front; 
    if (str.length() < 3){ 
    front = str; 
    } else { 
    front = str.substring(0, 3); 
    } 
    return front + front + front; 
} 
+0

它不回答問題。再讀一次;) – 2014-09-04 23:30:37