我的类有两个构造函数,一个用File
个对象,另一个用String
个对象,我想使用this
关键字。实现的函数是以File
为参数的函数,而String
的函数将调用this
。现在我想检查带有String
的构造函数中的异常,但是我收到错误,this
应该是第一行。如何检查错误,然后致电this
。
这是我的代码:
public Test (String filename) {
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
this(new File(filename)); // error
}
public Test (File f) {
/* implementation here */
}
这是确切的错误:Constructor call must be the first statement in a constructor
答案 0 :(得分:2)
不幸的是,由于他们的任意限制,这在Java中是不可能的。你有两个主要的可能性。
更惯用的Java技术是将所有内容包装在工厂函数中,以便捕获异常。工厂函数也很有用,因为它们允许您以多态方式创建对象,并帮助隐藏实际创建对象的详细信息。
public static Test create(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return new Test(filename);
}
private Test (String filename) {
this(new File(filename));
}
public Test (File f) {
/* implementation here */
}
另一种选择是在字节码中编写构造函数,其中不存在这样的限制。不幸的是,字节码的可读性和可维护性较差,因此您可能希望最大限度地减少主要Java应用程序中的字节码数量。您也可以使用非Java语言(如AspectJ)执行此操作。
编辑:如果你实际上并没有试图捕捉异常,那么还有第三种可能性。您可以在超级构造函数调用之前插入任意代码,方法是创建一个执行检查的单独函数,然后将其作为伪参数传递给超级构造函数调用。由于首先评估参数,因此您的代码将首先运行,但这有点像黑客。
public Test (String filename) {
this(doChecks(filename), new File(filename));
}
private static Void doChecks(String filename){
if (filename == null)
throw new NullPointerException("The String you entered is null.");
if (filename.isEmpty())
throw new IllegalArgumentException("The String you entered is empty.");
return null;
}
public Test (Void dummy, File f) {
this(f);
}
public Test (File f) {
/* implementation here */
}
答案 1 :(得分:0)
不,在致电this
之前,您无法检查错误。这是规范禁止的。事实上,你不需要它。让new File(filename)
抛出异常。
public Test (String filename) {
this((filename == null || filename.isEmpty()) ? null : new File(filename));
}
答案 2 :(得分:0)
如果我们在构造函数中使用this
或super
,this
或super
应该是构造函数中的第一个语句。如果从特定构造函数中抛出异常,那就更好了。
public Test (String filename) {
this(new File(filename));
}
让第二个构造函数处理由传递null
引起的任何异常。
public Test (File file) {
// exception handling code
// or new instance creation
}