Java中如何打破静态初始化块的限制

5

我有一个静态初始化块。它设置了将日志记录到文件的功能。如果出现问题,我只想跳出静态块。这是否可行?我知道可以使用if / else方法,但使用简单的break语句会使代码更易读。


这会使你的类处于不一致/无法使用的状态吗? - Clockwork-Muse
是的,它会。这是一个日志记录类。因此,如果出现故障,它仍然可以将日志输出写入控制台,但写入文件的日志将无法使用。 - user489041
1
我的意思是,如果你的类处于不可用状态,可能无法被类加载器(或类似物)加载,从而导致各种问题。请记住,所有 static final 变量都应该被初始化,无论如何... - Clockwork-Muse
6个回答

9
您的静态块可以调用一个方法。
static { init(); }

private static void init() {
     // do something
     if(test) return;
     // do something
}

4

您可能希望捕获所有异常:

static {
    try {
        // Initialization
    }
    catch (Exception exception) {
        // Not much can be done here
    }
}

但要注意:加载类不会失败,但某些或所有静态字段可能处于不一致的状态。


2

这是您正在寻找的内容吗?

label:
{
  // blah blah
  break label;
}

你可以在break语句下方跳转到一个标签吗? - user489041
标签必须位于块的开头,中断位置在块的末尾。 - Peter Lawrey
1
@user48,你不是要打破“to”标签,而是要打破“the”标签。 - dhblah
只有当 break 与标签嵌套层数超过一级时,它才有用。否则,它只是不好的编码风格,因为可以以更可读的方式避免使用它。 - Laurent Pireyn
您不能使用标签在代码中跳转到任意位置(因此,您不能转到当前代码下方的标签)。当它遇到标签时,这是标签的有效用法 - 它将转到标签,然后跳过被标记的部分(因此,“// blah blah”不会再次执行)。 - Clockwork-Muse
这似乎无法与静态块一起使用。 - Arefe

1
  • 如果是异常情况,请使用 try{throw new Exception();}catch
  • 如果是正常处理,请使用 if-then-elseswitch
    最终您可以使用标签,但在我看来这是一种非常糟糕的风格:

    //boolean condition;
    static {
     label:
     {
      System.out.println("1");
      if(condition) break label;
      System.out.println("2");
     }
    }
    

1
请不要使用HTML代码标签,只需缩进您的代码(4个空格或列表内的8个),代码将被美观地显示。 - Sean Patrick Floyd

0

尝试使用try/catch怎么样?

try{}catch(){}

0
在我看来,静态块在使用流程控制策略方面与其他块没有区别。你可以在任何地方使用BREAK(包括在静态块中),如果你觉得这样更易读,但一般的假设是它实际上会使代码变得不太易读,IF ELSE方法更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接