【问题标题】:Using try catch constructor chain java使用try catch构造函数链java
【发布时间】:2017-10-12 10:53:03
【问题描述】:

我有一个类构造函数,我需要执行一个克隆。从我读过的内容来看,最好的选择是使用复制构造函数,就像在 C++ 中一样。但是,我有一个问题。如果我的“常规”构造函数抛出异常,并且在“复制构造函数”中甚至不可能出现此类异常,那么如果第一条语句必须是 this,我该如何实现 try-catch。

public class X
{
   public X() throws MyException
   {
   }

   public X(final X original)
   {
      try {
         this();
      } catch (MyException e)
      {
      }
   }
}   

是否唯一的选择是将throws MyException 添加到复制构造函数?

【问题讨论】:

  • 为什么要打电话给this()
  • 如果您调用this(),您只需初始化一个新的空对象。如果你想要一个包含所有值的真实副本,你应该向x(final X original)添加一个空检查,然后将每个字段从原始复制到this.<field>
  • "如果我的“常规”构造函数抛出异常,而这种异常在“复制构造函数”中甚至不可能发生“即使你看不到方法,如果throws 存在,假设您需要管理它或重新抛出异常。不要假设方法声明中定义的异常不会发生。如果我需要更新你的类并且我看到定义了异常,我知道这是意料之中的,所以我不能在我的更新版本中抛出该异常而不必担心。合同已经签了。

标签: java constructor exception-handling this


【解决方案1】:

通过构造函数将所有数据复制到新实例中可能如下所示:

public class X
{
   // some Fields....
   int a, b, c;

   public X() { }

   public X(final X originalX) throws InvalidArgumentException
   {
      if(originalX == null) {
        throw new InvalidArgumentException("originalX should not be null!");
      }
      this.a = originalX.getA();
      //...
   }
   // getter-setter....
}

main() 或其他任何地方都这样称呼它:

// x_1 is filles with Data...
X x_2;
try {
    x_2 = new X(x_1);
} catch(InvalidArgumentException ex) {
    LOG.reportError(ex.getMessage());
    x_2 = new X();  // prevent NullPointer for usage afterwards
}

【讨论】:

  • 是的,但问题是关于“从this() 捕获异常”
  • 但是调用 this() 什么也没做,他的使用不应该是必需的。
  • 也许吧,但这是你的答案应该解释的;)如果构造函数有init() 语句,他能做什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2021-04-08
  • 2020-03-13
相关资源
最近更新 更多