2014-09-04 77 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