构造函数处理异常并使用此关键字Java

时间:2013-04-20 14:21:18

标签: java exception constructor this

我的类有两个构造函数,一个用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

3 个答案:

答案 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)抛出异常。

编辑:我看到了aizen92的评论:Actually that is what my constructor with the implementation has, it catches the exception may be thrown by file, so I just add the null exception and use this directly in my second constructor?

public Test (String filename) {
    this((filename == null || filename.isEmpty()) ? null : new File(filename)); 
}

答案 2 :(得分:0)

如果我们在构造函数中使用thissuperthissuper应该是构造函数中的第一个语句。如果从特定构造函数中抛出异常,那就更好了。

public Test (String filename) {
    this(new File(filename));
}

让第二个构造函数处理由传递null引起的任何异常。

public Test (File file) {
    // exception handling code
    // or new instance creation
}