【问题标题】:Is it wise to throw exceptions in a constructor?在构造函数中抛出异常是否明智?
【发布时间】:2012-04-05 20:29:56
【问题描述】:

我正在构建 DB 类,我想在构造函数中建立与数据库的连接,以便该类中的其余函数可以访问静态 dbLink。这是个好方法吗?

【问题讨论】:

  • 为什么不在你的类中提供一个connect() 方法,让你的类实例化没有例外。
  • 这更有意义:)
  • @anubhava 这是一个很好的“答案”,我会这样说,所以月球可以接受它。通常,构造函数应该只参与构造类。没有套接字、写入、状态更改等。
  • @DMoses:谢谢我在下面提供了答案。

标签: java architecture jdbc


【解决方案1】:

至于具体问题,在构造函数中抛出异常肯定是合法的。没有其他明智的方法可以防止“DB 类”实例与断开的连接一起使用。

至于具体的功能需求,你还有另一个大问题。您不应该在“DB 类”的构造函数中创建 DB 连接,并且肯定不会将其设为 static。这表明只要“DB 类”的实例存在于 Java 的内存中,您就打算保持连接打开。这反过来又是一个非常糟糕的主意。相反,应该在与执行 SQL 查询/查询的位置相同的 try 块中创建连接。连接也应该在该try 块的finally 块中关闭。这可以防止资源长期泄漏,否则会导致您的应用程序崩溃,因为数据库服务器因为打开时间过长而导致资源超时,或者因为打开的连接过多而耗尽资源。

另见:

【讨论】:

    【解决方案2】:

    我的建议是在您的类中提供一个connect() 方法,该方法将引发异常并让您的类实例化没有异常。

    【讨论】:

      【解决方案3】:

      "你好,是的,构造函数抛出异常是正常的,其实抛出异常就是 构造函数失败的唯一方法。

      但是,您应该小心从作为 RuntimeException 子类的构造函数中抛出任何异常。 Java 编译器不会强制调用代码处理此类异常,因此它们会带来一些额外的风险。有时可以使用它们,但要小心。”

      从这里:http://en.allexperts.com/q/Java-1046/normal-throw-exception-constructor.htm

      【讨论】:

        【解决方案4】:

        通常,创建某种连接对象实际上并不建立连接,它只是设置要建立的连接。使用connect() 方法来建立连接或在无法建立连接时抛出异常更有意义。

        我认为让构造函数建立连接没有意义,所以它不应该抛出任何异常。

        【讨论】:

          猜你喜欢
          • 2010-11-14
          • 1970-01-01
          • 2017-11-07
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          • 2014-08-02
          • 2014-11-03
          • 1970-01-01
          相关资源
          最近更新 更多