2017-06-02 276 views
-2

我不熟悉用Java編碼,請給我一個休息時間。無法解析爲變量

雖然運行此代碼,

public class operators { 

public static int getMonthNumber(String monthName) { 
    int monthNumber; 
    switch (monthName) { 
    case "January": monthNumber=1; 
    break; 
    case "February": monthNumber=2; 
    break; 
    default: monthNumber=0; 

    } 


} 
public static void main(String[] args) { 
    operators.getMonthNumber("January"); 
    System.out.println(monthNumber); 
     } 
} 

我得到這個消息,「monthNumber不能被解析爲一個變量」。我不明白爲什麼它不只是打印整數1。我知道解決的辦法將這個

int returnedMonthNumber=operators.getMonthNumber("January"); 

被替換

operators.getMonthNumber("January"); 

爲什麼不能只是打印整數1無必須分配一個變量的整數?

+0

你的代碼甚至沒有編譯。請閱讀[mcve]。從這個意義上說:請理解,這個網站不是編程學校,我們解釋絕對的基礎知識,併爲您解決你的語法錯誤。 – GhostCat

回答

1

正如其他人所指出的,這個網站是不是學習語言的基本知識的學校。但遲早會有人會來這裏尋找答案,以確切的問題。

您對Java的工作方式存在巨大的誤解。在你的代碼中,你犯了兩個錯誤。首先,如果可以訪問,則嘗試訪問已經消失的變量。其次,你嘗試訪問一個變量,你不能從你的呼叫中「看到」。您的代碼:關於第一個問題

public static void main(String[] args) { 
    operators.getMonthNumber("January"); 
    System.out.println(monthNumber); 
} 

更多信息: 你在你的方法getMonthNumber聲明變量monthNumber。所以它只存在於該方法的持續時間內。所以在調用方法時,變量就在那裏。在該方法之後,變量消失了。它被扔掉。但是在你的方法中返回一個變量值的副本。所以你可以把這個副本放到一個新的變量中,然後直接使用它或者直接使用它。這就是你指出的

int returnedMonthNumber = operators.getMonthNumber(「January」);

有沒有編程語言,我知道它的工作方式,你期望它的工作。如果有的話,它不會很流行,因爲這可能會導致很多錯誤,因爲錯字可能導致程序使用您不想使用的完全不同的變量。

有關第二個問題的更多信息: 一般而言,變量只能在括號內進行訪問。這意味着,在{}中聲明的變量只能在相同的括號內或括號內的括號內進行訪問。例如:

public static void main(String[] args) { // first bracket 

    final int dollar = 2; 
    System.out.println("i can access dollar: " + dollar); 

    { 
     final int euro = 33; 
     System.out.println("I can access dollar: " + dollar + ", and i can access euro: " + euro); 
    } 

    // you have to remove +euro to compile this: 
    System.out.println("But i cant access euro because i am outside the brackets where euro is declared: " + euro); 
} 

請始終遵守此規則,因爲它始終有效。它可以與ifs方法,while/for/do等方法一起工作。如果編譯器不能看到一個變量,它可能是一個錯字或錯誤的塊。

我見過很多初學者都在說你喜歡的話。他們想知道「編譯器爲什麼不知道我想要什麼?很明顯!」。但實際上並不明顯。你期望的行爲只是在你的腦海中「有用」。它可以爲您節省半行代碼。但是在更高級的例子中,你會發現按照你期望的方式實現它是一個非常糟糕的主意。每個初學者都會意識到這一點: 如果你想知道爲什麼編譯器不會做你想做的事情,那麼你只是沒有告訴他做你想做的事情。如果你明白我的意思。

1

'monthNumber'變量只存在於getMonthNumber()方法中。如果您在未將結果分配給任何內容的情況下調用它,結果將會丟失。

但是,您可以執行以下操作 - 將您的調用結果直接傳遞給println()調用。

System.out.println(operators.getMonthNumber("January")); 
1

上面的代碼看起來並不像它會編譯

public static int getMonthNumber(String monthName) { 
    int monthNumber; 
    switch (monthName) { 
    case "January": monthNumber=1; 
    break; 
    case "February": monthNumber=2; 
    break; 
    default: monthNumber=0; 

    } 

// You need to return something 

return monthNumber; 

} 

然後,你可以把它叫做

System.out.println(operators.getMonthNumber("January")); 
1
System.out.println(operators.getMonthNumber("January")); 

它直接傳遞到打印方法,將照顧其餘的部分。 println可以直接打印它的原因是它超載。

有對的System.out的PrintStream這麼多的重載方法:

println(boolean x) 
println(char x) 
println(int x) 
println(long x) 
println(float x) 
println(double x) 
println(char x[]) 
println(String x) 
println(Object x)