当前位置: 首页 > 知识库问答 >
问题:

无法在 try/捕获中初始化静态最终变量

马庆
2023-03-14

我试图初始化一个静态最终变量。然而,这个变量是在一个可以抛出异常的方法中初始化的,因此,我需要在一个try-catch块中。

即使我知道变量将在try或catch块上初始化,java编译器也会产生错误

最后一个字段a可能已经被赋值

这是我的代码:

public class TestClass {

  private static final String a;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
      a = null;
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}

我尝试了另一种方法,直接将其声明为null,但它显示了类似的错误(在这种情况下,这对我来说似乎完全是合乎逻辑的)

不能分配最终字段TestClass.a

public class TestClass {

  private static final String a = null;

  static {
    try {
      a = fn(); // ERROR
    } catch (Exception e) {
    }
  }

  private static String fn() throws Exception {
    throw new Exception("Forced exception to illustrate");
  }

}

对此有没有一个优雅的解决方案?

共有3个答案

牟嘉
2023-03-14

私有静态最终字符串a = null

最终属性只初始化一次。无论是在构造器中还是在这里。在为“a”提供值null后,不能为其提供新值。如果没有最终值,可以通过fn函数设置值

时旭东
2023-03-14

最终变量只能设置一次。

您不能(也不需要)在catch块中将a设置为null

进行以下更改:

public class TestClass {


      private static final String a = setupField();

      private static String setupField() {
        String s = "";
        try {
            s = fn();
        } catch (Exception e) {
          // Log the exception, etc.
        }
        return s;
      }

      private static String fn() throws Exception {
        return "Desired value here";
      }
刘乐童
2023-03-14

您可以先将值赋给局部变量,然后将其赋给 try-catch 块之后的最后一个变量

private static final String a;

static {

    String value = null;
    try {
        value = fn();
    } catch (Exception e) {
    }
    a = value;

}

这确保了对final变量的单个赋值

 类似资料:
  • 我有以下代码: 它从“VM参数”中读取并分配给变量。 由于静态最终变量仅在类加载时初始化,因此如何在有人忘记传递参数的情况下捕获异常。 目前,当我使用“property\u file\u location”变量时,在以下情况下会遇到异常: 若值存在,并且位置错误,则会出现FileNotFound异常 如果未正确初始化(值为null),则抛出NullPointerException 我只需要在初始化

  • 问题内容: 我想知道为什么默认情况下C,C ++和Java中的确切静态变量初始化为零?为什么对局部变量不是这样? 问题答案: 为什么要对静态变量进行确定性初始化而对局部变量不进行初始化? 了解如何实现静态变量。 它们的内存在链接时分配,并且它们的初始值也在链接时提供。 没有运行时开销。 另一方面,用于局部变量的内存是在运行时分配的。堆栈必须增长。你不知道以前在那里。如果需要,可以清除该内存(将其清

  • 问题内容: 如何在Java中初始化类的私有静态成员。 尝试以下操作: 但是在创建类A的第二个对象然后调用f1()时,我得到了空指针异常。 问题答案: 初始化静态成员的首选方法是(如上所述) 或者对于更复杂的初始化代码,您可以使用静态初始化程序块:

  • 问题内容: 我尝试了解通过引用同一封闭类对象初始化静态字段时初始化顺序的行为。 上面这段代码的输出是: 如果我将变量修改为除plain之外的其他任何内容: 输出为: 为什么会这样呢? 请注意,即使同时声明了两者,输出也是如此,在这种情况下,声明之前 问题答案: 静态最终成员先于其他静态成员初始化。 非最终静态成员按出现顺序初始化 因此,在您的第一种情况下: 构造函数在初始化之前首先被调用,因此被显

  • 我遇到了下面的Java代码,起初看起来不错,但从未编译过: 下面是IDE :变量USER_ID可能已分配的错误消息。 将值赋值给静态最终变量有问题吗?

  • 我想了解各种情况下类实例的初始化 在JLS-7第12.5节中,没有提到如何以及何时初始化最终实例变量?如果实例变量被声明为final,是否有人能给我一点参考来理解其行为? 给出的输出如下 在哪里作为 是否将输出作为