我希望我的模块的api只在出现任何错误且模块无法执行其任务时抛出MyPackageSpecificException。 (原始异常将作为MyPackageSpecificException的原因)。
现在,对于一个构造函数,我需要一个URL作为查找资源的参数。我还想创建一个替代构造函数,可以给出URL的String表示:
public MyClass(String urlString) throws MalformedURLException{
this(new URL(urlString));
}
当URL构造函数抛出MalformedURLException时,我想通过执行以下操作将其包装到MyPackageSpecificException中:
public MyClass(String urlString) throws MyPackageSpecificException{
try{
this(new URL(urlString));
} catch (MalformedURLException e){
throw new MyPackageSpecificException(e);
}
}
但是,上面的内容无效,因为super()或this()构造函数调用必须发生在构造函数的第一行。
如果super()或this()构造函数抛出一个我想要包装成其他内容的异常,同样的问题也适用。
我该如何解决这个问题?或者我正在努力做坏事?
答案 0 :(得分:6)
尝试以下方法:
public class MyClass
{
private URL url;
public MyClass(URL url)
{
this.url = url;
}
public MyClass(String urlString) throws MyPackageSpecificException
{
this(toURL(urlString));
}
private static URL toURL(String urlString) throws MyPackageSpecificException
{
try
{
return new URL(urlString));
}
catch (MalformedURLException e)
{
throw new MyPackageSpecificException(e);
}
}
}
答案 1 :(得分:3)
如果它适合您的代码,您可以使用静态创建方法:
private MyClass(String urlString) { ... }
public static MyClass createMyClass(String urlString) throws MyPackageSpecificException {
try {
new MyClass(urlString);
catch (Exception e) {
throw new MyPackageSpecificException(e);
}
}
答案 2 :(得分:0)
不是使用this()而是使用一个公共的init()方法,该方法采用URL参数,因此它不需要是构造函数的第一行。
public MyClass(String url) throws MyPackageSpecificException
{
try
{
init(new URL(url));
}
catch (MalformedURLException e)
{
throw new MyPackageSpecificException(e);
}
}
public MyClass(URL url)
{
init(url);
}
private void init(URL url)
{
// do constructor work here
}