2012-11-17 68 views
0

我有一个对象“LinkFinder”,我得到一个异常如果它得到一个格式不正确的URL,但我不喜欢使用System.out和打印错误的想法。而不是构造函数返回初始化对象,我可以强制它返回null或什么?Java - 关于捕获异常的建议?

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; 
    } 

} 
+1

你可以让你自己的构造函数返回null(或任何东西)? –

回答

1

不,你不能。唯一的方法是你的构造函数不会返回一个对象(或返回null),如果它没有完成。

如果你想有一个空的对象,如果URL是畸形的,那么解决办法是应用try块周围的对象实例化的代码(即new LinkFinder(url)),并在其catch块设置为null引用。

+0

这实际上是我最终做的。我抛出异常,而不是捕获它并捕获它并在调用对象中处理它。 –

0

理论上,这是例外通过try-catch块i.e.catch预期的异常处理的唯一目的,做根据需要处理(在你的情况下,分配this.urlnull)。

如果您认为LinkFinder应优雅地初始化为null如果无效sourcePage,您的代码似乎很好。虽然你可以根据你的需要决定System.outlogger

实际上,因为你是消化无效的输入,并与null分配this.url这可能会导致NullPointerException后,它并没有太大的意义。用一些默认值初始化会更好。

+0

理想情况下,我想将LinkFinder本身设置为null,而不是实例字段。有没有办法让对象设置为null? 我真的不希望将this.url设置为null,因为这个原因,我不想稍后处理它。 –

+0

@ user1055516:如果您正在寻找一次性使用解决方案,那么在实例化点而不是构造器中执行类似的异常处理。这样,如果构造函数抛出异常,您的对象实例将被设置为null。 –

+0

啊,好主意谢谢。异常处理对我来说是新的。可以这么说,我忘记了这个例外就是“上链”。 –

0

而是在控制台上,您可以使用记录器记录异常,并作为URL返回null打印异常的,但你必须在这之后空检查网址,

您可以使用log4j的Apache的,这是非常容易使用。

0

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

0

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

优雅的方式是使构造重新抛出异常,所以你的表现层将使用尝试捕捉处理错误:

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更改为想要显示错误的方式。

0

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