gpt4 book ai didi

java - 构造函数处理异常并使用 this 关键字 Java

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:09 27 4
gpt4 key购买 nike

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

这是确切的错误:构造函数调用必须是构造函数中的第一个语句

最佳答案

不幸的是,由于其任意限制,这在 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 语言执行此操作。

编辑:如果您实际上并没有 try catch 异常,那么还有第三种可能性。您可以通过创建一个单独的函数来执行检查,然后将其作为虚拟参数传递给 super 构造函数调用,从而在 super 构造函数调用之前插入任意代码。由于首先评估参数,因此您的代码将首先运行,但这有点 hack。

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 */
}

关于java - 构造函数处理异常并使用 this 关键字 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16121348/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com