我有一个对象“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;
}
}
答案 0 :(得分:1)
不,你不能。构造函数不返回对象(或返回null)的唯一方法是它是否未完成。
如果你想要一个空对象,如果URL
格式错误,那么解决方案是在你的对象实例化代码(即new LinkFinder(url)
)周围应用一个try块,并在其catch块中设置引用null。
答案 1 :(得分:0)
从理论上说,这是通过try-catch
阻止异常处理的唯一目的iecatch预期的异常并根据需要进行处理(在您的情况下,分配this.url
null
)。
如果您认为LinkFinder
应该在null
无效的情况下使用sourcePage
进行优雅初始化,那么您的代码似乎没问题。虽然您可以根据需要决定System.out
与logger
。
但实际,因为您正在消化无效输入并将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()
方法以允许外部代码检查条件。