2017-06-02 576 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)