在静态try-catch

时间:2015-06-11 03:47:18

标签: java exception static final

我想读取配置文件的属性并将其分配给static final变量,如果配置文件是省略/不存在,则使用默认值硬编码。

public static final String NOTIFY_ALI;
static  {
    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        NOTIFY_ALI = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        NOTIFY_ALI = "http://notify.foo.com/notify";
    }
}

NOTIFY_ALI应由配置文件notify.conf使用密钥notify_ali分配,或者如果文件中未明确,则将http://notify.foo.com/notify作为默认值。如果配置文件不存在(将发生IOException),只需捕获异常并分配默认值。

但是上面的代码片段给出了编译时间Err:

Error:(18, 13) java: variable NOTIFY_ALI might already have been assigned

我可以这样做吗?

2 个答案:

答案 0 :(得分:2)

创建一个返回URL的方法,并在声明

时用于指定它
public static final String NOTIFY_ALI = getURL() ;

private static String getURL()
{ 
    String aux ;

    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        aux = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        aux = "http://notify.foo.com/notify";
    }
    return aux ; 
}

如果你需要初始化多个变量,你可以这样做

public static final InitVariables IV = initVariables() ;

public class InitVariables {
    String NOTIFY_ALI ;
    String CONTACT_EMAIL ;
    int numEmployees ; 
}

private static InitVariables initVariables()
{ 
    InitVariables iv ;

    iv = new InitVariables() ;

    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        aux = notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");

    } catch (IOException e) {
        e.printStackTrace();
        aux = "http://notify.foo.com/notify";
    }

    iv.NOTIFY_ALI = aux ;

    iv.CONTACT_EMAIL = "you@somedomain.com";
    iv.numEmployees = 0 ;

    return iv ; 
}

答案 1 :(得分:1)

为什么不删除静态初始化程序块并创建一个静态方法,其结果分配给静态最终变量?

public static final String NOTIFY_ALI = init();

private static String init() {
    try {
        PropertyReader notifyConf = new PropertyReader("notify.conf");
        return  notifyConf.getProperty("notify_ali","http://notify.foo.com/notify");
    } catch (IOException e) {
        e.printStackTrace();
        return "http://notify.foo.com/notify";
    }
}