在if / else构造中声明一个变量

时间:2013-04-16 15:06:39

标签: java variables declaration

我正在CodingBat.com(extraFront)上解决一个基本的Java字符串问题。

任务是给定一个任意长度的字符串,返回重复三次的两个第一个字符。第一个例子是我最终直观地做的事情:

public String extraFront(String str) {

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

哪个给我一个错误,前面无法解决。我猜我需要在循环外定义变量,所以我将代码更改为以下代码,它可以正常工作:

public String extraFront(String str) {

  String front;

  if (str.length() <= 2){
    front = str;
  }else{
    front = str.substring(0,2);
  }
  return front+front+front;
}

让我感到困惑的是,为什么这会产生影响,因为无论如何变量都会被宣布,不是吗?这是CodingBat如何处理代码的特性,还是这实际上是一个错误?如果是,为什么这个错误的代码到底是什么?如果它不是不正确的,它是不好的风格?

2 个答案:

答案 0 :(得分:4)

  

让我感到困惑的是,为什么这会产生影响,因为无论如何变量都会被宣布,不会吗?

这是一个范围问题。变量仅在声明它的块中可见。这与CodingBat无关 - 它是Java语言的一部分。来自section 6.3 of the JLS

  

声明的范围是程序的一个区域,声明声明的实体可以使用简单的名称引用该区域,只要它是可见的(第6.4.1节)。   ...
  块(第14.4节)中局部变量声明的范围是声明出现的块的其余部分,从其自己的初始化器开始,并包括局部变量声明语句中右侧的任何其他声明符。

我还恳请您了解conditional operator,这可以帮助解决这些问题:

String front = str.length() <= 2 ? str : str.substring(0, 2);

答案 1 :(得分:1)

当您在block中声明局部变量时,variable只会在该块中显示,符合scoping Java language规则>

你可以看到一个简单的video:)

  

变量仅在其声明中可用,直到声明它的大括号末尾。程序文本中变量有效的区域称为其范围。

Blocks and statements