Java 编写自定义异常的最佳方法

Java 编写自定义异常的最佳方法,java,exception-handling,Java,Exception Handling,我正在尝试编写一个带有3个构造函数的自定义异常。我可以在3个不同的构造函数中初始化最终变量吗?我得到编译错误。如何使此错误消除 public class CrifServiceFaultException extends RuntimeException { /** * */ private static final long serialVersionUID = 1L; public CrifSe

我正在尝试编写一个带有3个构造函数的自定义异常。我可以在3个不同的构造函数中初始化最终变量吗?我得到编译错误。如何使此错误消除

    public class CrifServiceFaultException extends RuntimeException {

        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        public CrifServiceFaultException(String message) {  
// // - The blank final field errorDescription may not have been 
            super(message);
        }

        public CrifServiceFaultException(String processCode,
                String processDescription, String transformCode,
                String transformDescription) {  
// - The blank final field errorDescription may not have been 
     initialized
            super(processDescription + " " + transformDescription);
            this.processCode = processCode;
            this.processDescription = processDescription;
            this.transformCode = transformCode;
            this.transformDescription = transformDescription;
        }

        public CrifServiceFaultException(String errorCode, String errorDescription) {            // The blank final field transformDescription may not have been initialized

            super(errorDescription);
            setErrorCode(errorCode);
            setErrorDescription(errorDescription);
        }

        final private String processCode;
        final private String processDescription;
        final private String transformCode;
        final private String transformDescription;
        final private String errorCode;
        final private String errorDescription;
    // getters are here

    }
因为,根据,每个最终变量必须在构造函数结束之前初始化

在您的例子中,在每个构造函数中,您都会保留一些未初始化的构造函数(在形式上,它们是空的)。简而言之,您必须为它们设置一个值(即使在特定构造函数中未使用):

请注意,即使是文档也表明:

…声明变量final可以作为有用的文档


从这句话中,我们可以猜到,
final
只是一种装饰,用于避免编译时的小错误(实际上与C++中的
const
非常相似)。无论如何,在我看来,我们不应该假设
final
变量是可变的(即使通过JNI),因为它们可以在运行时实现强大的优化(我特别考虑热点):考虑并发访问和缓存一致性(特别是对于基元类型).

请编辑您的问题以添加您遇到的编译错误。遗憾的是,这只是编译器的限制。Final变量在运行时是普通变量(这对JNI来说很好)@Enerccio是的,甚至规范都说“…声明一个Final变量可以作为有用的文档…”即使理论上JVM可以启用特定的优化(特别是在热点),老实说,我不知道它在RT时是否有任何区别。
public CrifServiceFaultException(String message)
{
    super(message);

    processCode = "";
    processDescription = "";
    transformCode= "";
    transformDescription= "";
    errorCode= "";
    errorDescription= "";
}

public CrifServiceFaultException(String processCode,
        String processDescription, String transformCode,
        String transformDescription)
{

    super(processDescription + " " + transformDescription);
    this.processCode = processCode;
    this.processDescription = processDescription;
    this.transformCode = transformCode;
    this.transformDescription = transformDescription;

    errorCode= "";
    errorDescription= "";
}

public CrifServiceFaultException(String errorCode, String errorDescription)
{
    super(errorDescription);
    setErrorCode(errorCode);
    setErrorDescription(errorDescription);

    processCode = "";
    processDescription = "";
    transformCode= "";
    transformDescription= "";
}