class TestCase{
static{
System.out.println("hello");
return;
}
public static void main(String[] args){
System.out.println("main");
}
}
答案 0 :(得分:3)
static
块用于初始化static
变量,不需要在return
内调用throw
或Exception
return
之一。
如果您需要到throw
或Exception
和class 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
方法,不会抛出已检查的异常。