如果声明“不是声明”?

时间:2016-02-01 07:24:48

标签: java intellij-idea

示例代码:

public class SalCal {
    public static void main(String[] args) {
        int a=0;
        if (a > 1)
            String string = "fds";//hint:not a statement
    }
}

Intellij IDEA暗示String string = "fds";

  

不是声明

但是,如果我在String string = "fds";的任一方面添加大括号,它就不再像以前那样提示了。为什么呢?

4 个答案:

答案 0 :(得分:6)

Intellij IDEA表示,因为它不是声明。这是一个声明 1

当您添加大括号时,您将其转换为块语句...这是一个声明。

但这就是问题。如果这段代码合法,那将毫无用处。

  if (a> 1)
        String string = "fds";

为什么呢?因为声明的范围必须在if语句结束时结束。您将声明一个无法使用的变量。

以下是两种选择:

1)此版本声明if-block

中的变量
  if (a> 1) {
        String string = "fds";
        // you can use 'string' here
  }
  // ... but not here, because it is now out-of-scope.

2)此版本在if语句之前声明并初始化变量,并在if:

中为其分配一个新值。
  String string = "asdf";
  if (a> 1) {
        string = "qwerty";  // assignment, not declaration
  }
  // OK to use 'string' here.
@ Maroun的回答给出了为什么你写的东西不是有效的Java代码的技术原因。

1 - 实际上,Intellij IDEA编译器正在“松散于事实”。实际上,JLS称之为“局部变量声明语句”。所以它在技术上是一个“声明”......但它是一种特殊的类型,不能在所有可以使用的普通环境中使用。

答案 1 :(得分:1)

答案在JLS - 6.1. Declarations

  

一个局部变量,以下之一:

     
      
  • 在块(§14.4

  • 中声明的局部变量   
  • 在for语句(§14.14

  • 中声明的局部变量   

你的情况不属于上述情况,所以你得到了:

==

有很多解决方案:

  • 在外部范围内声明error: variable declaration not allowed here
  • string语句中添加括号。

答案 2 :(得分:0)

String string = "fds";是带有初始化程序的声明,而不是语句(例如方法调用或对现有变量的赋值)。当你使用大括号时,你引入了一个新的块作用域,在这个作用域中声明块局部变量是有意义的,但是在一个简单的“then”中,声明一个变量是完全没用的。

答案 3 :(得分:0)

1)一

String string =" asdf&#34 ;;

//如果你没有花括号,你就像

一样

// if中的所有内容都将遵循条件

if(a> 1)

//声明

2)二

//你使用那些{}来阻止你的陈述 字符串字符串=" asdf&#34 ;;

if(a> 1){//这是一个声明;

//语句字符串

}