包装在super / this构造函数中抛出的异常会调用其他异常

时间:2009-08-14 08:18:06

标签: java exception constructor

我希望我的模块的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()构造函数抛出一个我想要包装成其他内容的异常,同样的问题也适用。

我该如何解决这个问题?或者我正在努力做坏事?

3 个答案:

答案 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
}
相关问题