【问题标题】:How to initialise a static final class member of type ObjectName?如何初始化 ObjectName 类型的静态最终类成员?
【发布时间】:2014-03-05 22:39:50
【问题描述】:

以下代码无法编译(“变量名可能尚未初始化”):

import javax.management.*;

public class Main {
    public final static ObjectName name;
    static {
        try {
            name = new ObjectName("abc");
        } catch (final Exception e) {
            System.exit(1);
        }   
    }   
}

但是,以下代码也无法编译(“变量名可能已被分配”):

import javax.management.*;

public class Main {
    public final static ObjectName name;
    static {
        try {
            name = new ObjectName("abc");
        } catch (final Exception e) {
            name = null;
            System.exit(1);
        }   
    }   
}

我不认为编译器对这两种情况都是正确的,但无论如何我们应该如何初始化静态最终 ObjectName?

【问题讨论】:

  • 我想。当你使用final时,它应该在你声明自己时被初始化。请尝试此逻辑并告诉您是否仍然出现错误
  • 为什么ObjectName 构造函数无论如何都会抛出异常?这就是代码的味道。
  • @DanTemple 构造函数抛出异常是完全合法的。代码气味在这里是另一回事。

标签: java jmx


【解决方案1】:

第一条建议是不要打电话给System.exit()。它会导致应用程序突然退出,没有正常清理。

如果您绝对必须在该精确点退出应用程序,那么您的解决方法是添加

throw e; 

在您拨打System.exit() 之后。

如果您对编译器错误感到好奇,您可能有兴趣阅读this question

【讨论】:

    【解决方案2】:

    编译器期望,在您的静态初始化程序块内的所有可能的执行分支中ObjectName 被分配一个值。

    static {
        try {
            name = new ObjectName("abc");
        } catch (final Exception e) {
            System.exit(1);
        }   
    }   
    

    由于ObjectName没有在catch-block中赋值,因为没有抛出异常,编译器不允许。

    如果在catch块中抛出异常,是可以接受的。

    alternative method 用于实现我更喜欢的静态初始化程序块,该块是对私有静态函数的简单调用:

    static  {
       init();
    }
       private static init()  {
          //do stuff
       }
    

    【讨论】:

      【解决方案3】:

      只需使用私有静态方法而不是静态初始化器:

      private static final ObjectName name = initObjectName();
      
      private static ObjectName initObjectName() {
         try {
            return new ObjectName("abc");
         } catch (MalformedObjectNameException e) {
            return null;
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 2015-05-18
        • 2023-03-18
        • 2020-01-31
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 2013-07-12
        相关资源
        最近更新 更多