5

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

4

3 回答 3

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 应用程序中的字节码数量。您也可以使用 AspectJ 等非 Java 语言来执行此操作。

编辑:如果您实际上并没有尝试捕获异常,那么还有第三种可能性。您可以在超级构造函数调用之前插入任意代码,方法是创建一个执行检查的单独函数,然后将其作为虚拟参数传递给超级构造函数调用。由于首先评估参数,因此您的代码将首先运行,但这有点小技巧。

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 */
}
于 2013-04-20T14:24:25.017 回答
0

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

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

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

public Test (File file) {
    // exception handling code
    // or new instance creation
}
于 2013-04-20T14:29:17.817 回答
0

不,您不能在 call 之前检查错误this。这是规范禁止的。事实上,你并不需要它。让我们new File(filename)抛出异常。

编辑:我看到aizen92的评论:实际上这就是我的构造函数的实现,它捕获了文件可能抛出的异常,所以我只是添加了空异常并直接在我的第二个构造函数中使用它?

public Test (String filename) {
    this((filename == null || filename.isEmpty()) ? null : new File(filename)); 
}
于 2013-04-20T14:24:37.660 回答