为什么静态块中不允许返回和抛出关键字

时间:2017-04-20 02:03:01

标签: java initializer

class TestCase{

  static{

    System.out.println("hello");

    return;

  }
  public static void main(String[] args){

    System.out.println("main");

  }

}

4 个答案:

答案 0 :(得分:3)

static块用于初始化static变量,不需要在return内调用throwException return之一。

如果您需要throwExceptionclass Whatever { public static varType myVar = initializeClassVariable(); private static varType initializeClassVariable() { // initialization code goes here } } ,那么我建议您使用静态初始化块的Java™教程所说的内容改为指定方法:

Sum-B[i]

取自https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

答案 1 :(得分:2)

不允许return,因为静态块严格来说不是一种方法。没有"来电"返回,当然没有什么可以返回值。此外,通过稍微重构代码,总是可以实现无表达式返回的本地流量控制效果。

(在您的示例中,return无论如何都是多余的......从本地流控制的角度来看。)

简而言之,return是不允许的,因为它没有意义。 (就像您在循环语句中不能使用continue一样。)

传播出静态块的异常有问题。基本上,应用程序代码无法捕获和处理它们。

  • 检查/未检查区分的重点是确保不能忽略某些异常。因此,Java语言将传播已检查异常的静态块视为编译错误。

  • 另一方面,允许在静态块中抛出未经检查的异常(并且不会被捕获)。这导致ExceptionInInitializerError,并且离开了您尝试在" dead"中初始化的类。州。通常情况下,应用程序无法从中恢复。

    为什么允许这个?鉴于可能出现未经检查的异常的无数方法,Java语言坚持在静态初始化程序块中处理它们是不切实际的。此外,意外的+未经检查的异常是一个真正的应用程序错误。处理错误的最简单/最安全的方法是让应用程序死掉......留下证据让程序员诊断并修复错误。

答案 2 :(得分:1)

这个问题也适用于实例初始化器和静态初始化器。

可以允许return语句,它在return方法中与void一样有用。但是,我认为最大的问题是存在多个初始值设定项时的模糊性:

static{  // 1
    ...
    ...return;
    ...
}
static{  // 2
    ...
}

如果执行return,它是否只是终止块1,并继续阻止2,还是终止所有静态启动代码?

关于throw的问题,请参阅Why is it not allowed to throw an exception in a Java instance initialization block?

我的理解是,如果静态/实例初始化器无条件地抛出异常,则类/构造函数将始终失败,使其几乎无用。因此Java禁止它。

解决方法:

return可以通过break从标记的块中进行模拟:

static
{
    STATIC:
    {
        break STATIC;
    }
}

无条件throw可以通过if(true)

来实现
static
{
    if(true) throw new Error();
}

(Java专门假装不知道该语句是肯定执行的)

答案 3 :(得分:0)

因为无法声明它们返回值或抛出异常。它们本质上是匿名static void方法,不会抛出已检查的异常。