0

我有一个对象“LinkFinder”,如果它收到格式错误的 URL,我将抛出异常,但我不喜欢使用 System.out 并仅打印错误的想法。我可以强制它返回 null 或其他东西,而不是构造函数返回初始化的对象吗?

private URL url;

//constructor in question
public LinkFinder(String sourcePage) 
{
    try
    {
        this.url = new URL(sourcePage);
    }
    catch (MalformedURLException e)
    {
        System.out.print("Malformed URL Exception: Setting URL to NULL");
        this.url = null;
    }

}
4

6 回答 6

1

不,你不能。构造函数不返回对象(或返回 null)的唯一方法是它未完成。

如果您想要一个URL格式错误的空对象,那么解决方案是在您的对象实例化代码(即)周围应用一个 try 块new LinkFinder(url),并在其 catch 块中将引用设置为 null。

于 2012-11-17T07:44:28.853 回答
0

从理论上讲try-catch,这是通过块 iecatch 预期异常进行异常处理的唯一目的,并根据需要进行处理(在您的情况下,this.url使用分配null)。

如果您认为LinkFinder应该null在 invalid 的情况下优雅地初始化sourcePage,那么您的代码似乎很好。尽管您可以根据需要决定System.outlogger

实际上,这并没有多大意义,因为您正在消化无效输入并分配this.url可能null稍后导致NullPointerException的结果。最好使用一些默认值进行初始化。

于 2012-11-17T07:12:44.243 回答
0

除了在控制台上打印异常,您可以使用 logger 记录异常,并将 null 作为 url 返回,但是在此之后您必须检查 url 是否为 null,

您可以使用非常易于使用的 apache 中的 log4j。

于 2012-11-17T07:15:59.950 回答
0

您不必显式调用this.url = null;,因为如果抛出异常,url则不会初始化,并且由于它是实例变量,因此它将默认值设置为null。您应该使用 try catch 来处理这种情况,以解决这种“意外行为”。例如重定向到不同的url.

于 2012-11-17T07:18:15.047 回答
0

根据您的问题,我假设 LinkFolder 类的意图是处理您的应用程序中的某种数据,并且它被另一个处理您的程序表示的类使用。

优雅的方法是让构造函数重新抛出异常,因此您的表示层将使用 try catch 处理错误:

public LinkFinder(String sourcePage) throws MalformedURLException
{
    this.url = new URL(sourcePage);
}

演示文稿将如下所示:

try {
    LinkFinder lf = new LinkFinder("whatever");
} catch (MalformedURLException e) {
    System.out.print("Malformed URL Exception.. it has sense to put it right here");
}

将 println 更改为您想要显示错误的方式。

于 2012-11-17T07:20:18.770 回答
0

要直接回答您问题的第二部分,不,您不能让构造函数 return null。构造函数只能返回新构造的对象或抛出错误,就像@Hernan 建议的那样。另一种处理方式,设置this.url = null需要外部代码来检查这个条件,或者url设为私有,然后只需要这个类的内部代码来检查条件。如果需要,您可以提供一种bool isUrlBroken()方法来允许外部代码检查条件。

于 2012-11-17T07:32:13.843 回答