【问题标题】:Java empty blocks inside a method different from other blocks?与其他块不同的方法内的Java空块?
【发布时间】:2019-03-10 03:56:45
【问题描述】:

我了解块定义了变量的范围。方法内的空块用于设置范围。但是为什么方法内部的空块初始化变量以及与循环等使用的块不同。

class A{
    public static void main(String args[]){
        int a;
        int b:
        {
            a = 10;
        }
        for(int i = 0; i < 1; i++){
            b = 20;
        }
        System.out.println(b); //error here
        System.out.println(a);
        // doesnt give error and prints 10. why?
    }
}

我的问题是:为什么方法中空块的属性与循环或条件块等使用的块不同

【问题讨论】:

  • 没有循环或条件的非空块可以很容易地确定为始终执行。虽然您可以看到您的 for 循环必须至少运行一次,但 JLS 中没有描述如何确定这一点。
  • 这里回答:Initialization Blocks
  • @JamieSnipesThankyou..但我的问题不是关于静态初始化块。我对任何类型的方法中空块的属性感到困惑。我现在明白了。

标签: java core object-initializers empty-list


【解决方案1】:

执行顺序。

请看这里的文章:

Order of Execution

【讨论】:

  • 那不是初始化块。这是方法内部的常见代码块。
  • 同样在提供的链接中,它提到在创建对象时执行初始化块。它与“实例初始化块”分开提及。但是,除非显式调用该方法,否则在创建对象时不会执行方法内的空块。是不是。如有错误请指正。
  • 你的main方法有一个静态初始化块{a=10;},A被初始化。从编译器的角度来看,B 不是,也可能永远不会。
  • 我想 {a=10;} 里面的 main 不是静态初始化块。这只是静态方法中的一个空块。它与静态块完全不同吗?
  • 静态初始化块是一段以static 开头并在括号内并放置在类声明内部但在public class A{ static {System.out.println("Static block");} } 等任何方法之外的代码。静态初始化块只能访问静态变量。在问题中,ab 都是方法内部的局部变量。
【解决方案2】:

因为a 的块无论如何都会被执行,因为没有封闭的运算符。但是b 在循环内部被初始化,所以编译器看到b = 20 只在循环内部执行,如果循环没有被执行,b 没有被初始化。并且编译器不会运行您的代码以了解没有不执行循环的代码路径。

【讨论】:

    【解决方案3】:

    我怀疑您遇到的是编译错误,而不是运行时错误。 它假设 b 从未初始化,因为编译器假设 for 循环可能不会执行。

    您应该始终将变量设置为默认值,以防万一。

    【讨论】:

    • 你最后的说法不正确。有时您希望变量未初始化,以确保所有可能的代码路径都将其设置为一个值。
    • 是的。现在我懂了。谢谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多