Java - 捕获异常的建议?

时间:2012-11-17 07:10:05

标签: java exception-handling

我有一个对象“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;
    }

}

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

如果您认为LinkFinder应该在null无效的情况下使用sourcePage进行优雅初始化,那么您的代码似乎没问题。虽然您可以根据需要决定System.outlogger

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分: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更改为您想要显示错误的方式。

答案 5 :(得分:0)

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