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