Java 如何使用引发异常的方法初始化最终静态数据成员

Java 如何使用引发异常的方法初始化最终静态数据成员,java,Java,我试图初始化类的一些静态final数据成员 这就是我正在尝试的 package mypkg; import java.util.*; import java.text.SimpleDateFormat; public class Customer { ... private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy"); private static final Date DOB_MIN=sdf.parse("1-1

我试图初始化类的一些
静态final
数据成员

这就是我正在尝试的

package mypkg;
import java.util.*;
import java.text.SimpleDateFormat;
public class Customer {
...
private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
private static final Date DOB_MIN=sdf.parse("1-1-1985");
private static final Date DOB_MAX=sdf.parse("31-12-1995");
...
}
但据我所知,
.parse()
抛出必须处理的
ParseException

但是正如您所看到的,您不能在那里使用
try catch
异常委托

此外,我不能使用
静态初始值设定项块
,因为这些成员本质上是
final

所以

有没有办法做到这一点

总之,


如何使用抛出异常的方法初始化最终静态数据成员n

创建一个静态解析函数,委托给sdf.parse并捕获异常

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
private static final Date DOB_MAX = safeParse("31-12-1995");

static Date safeParse(String input) {
    try {
        return sdf.parse(input);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}
private static Date parse( String date) {
    try {
        return sdf.parse( date );
    } catch (Exception ex) {
        throw new IllegalStateException( "Failed to initialise date "+date, ex );
    }
}

创建一个静态解析函数,该函数委托给sdf.parse并捕获异常

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
private static final Date DOB_MAX = safeParse("31-12-1995");

static Date safeParse(String input) {
    try {
        return sdf.parse(input);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}
private static Date parse( String date) {
    try {
        return sdf.parse( date );
    } catch (Exception ex) {
        throw new IllegalStateException( "Failed to initialise date "+date, ex );
    }
}

最简单的方法是编写一个处理异常的方法

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
private static final Date DOB_MAX = safeParse("31-12-1995");

static Date safeParse(String input) {
    try {
        return sdf.parse(input);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}
private static Date parse( String date) {
    try {
        return sdf.parse( date );
    } catch (Exception ex) {
        throw new IllegalStateException( "Failed to initialise date "+date, ex );
    }
}

但是,您应该非常小心使用
SimpleDataFormat
,因为它不是线程安全的,所以在每个人之间共享同一个实例可能不是一个好主意。如果您只使用它初始化常量,这没关系,但是如果您计划在其他地方使用它,请确保只在同步块中调用
sdf.parse()

最简单的方法是编写一个处理异常的方法

private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
private static final Date DOB_MAX = safeParse("31-12-1995");

static Date safeParse(String input) {
    try {
        return sdf.parse(input);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}
private static Date parse( String date) {
    try {
        return sdf.parse( date );
    } catch (Exception ex) {
        throw new IllegalStateException( "Failed to initialise date "+date, ex );
    }
}

但是,您应该非常小心使用
SimpleDataFormat
,因为它不是线程安全的,所以在每个人之间共享同一个实例可能不是一个好主意。如果您只使用它来初始化常量,这很好,但如果您计划在其他地方使用它,请确保
sdf.parse()
仅在同步块中调用。

此外,我不能使用静态初始化块,因为这些成员本质上是最终成员。

当然可以。只要在静态块内,您总是设置字段或传播异常。不会有编译器错误

这就很好地编译了:

    private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
    private static final Date DOB_MIN;
    private static final Date DOB_MAX;

    static{
        try {
            DOB_MIN=sdf.parse("1-1-1985");
             DOB_MAX=sdf.parse("31-12-1995");
        } catch (ParseException e) {
            //handle your exception here.
            //could rethrow unchecked exception too

            throw new IllegalStateException("invalid dates");
        }

    }

我也不能使用静态初始值设定项块,因为这些成员本质上是最终成员。

当然可以。只要在静态块内,您总是设置字段或传播异常。不会有编译器错误

这就很好地编译了:

    private static SimpleDateFormat sdf=new SimpleDateFormat("dd-MM-yyyy");
    private static final Date DOB_MIN;
    private static final Date DOB_MAX;

    static{
        try {
            DOB_MIN=sdf.parse("1-1-1985");
             DOB_MAX=sdf.parse("31-12-1995");
        } catch (ParseException e) {
            //handle your exception here.
            //could rethrow unchecked exception too

            throw new IllegalStateException("invalid dates");
        }

    }
可能的重复可能的重复