java - 确保*所有*代码路径返回有效的 JDBC 连接或抛出异常(禁止 "null")

标签 java jdbc nullpointerexception

目标:确保所有代码路径抛出或返回有效连接;我试图不惜一切代价明确避免连接对象返回为“null”。

这是我能想到的最好的:

public class JdbcConnectionManager {
  public static class JdbcConnectionFailureException extends Exception {
    private static final String JDBC_CONNECTION_INVALID_MESSAGE =
        "JDBC connection invalid, checked with timeout value of: "
            + JdbcConnectionManager.JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS;
    private static final long serialVersionUID = 1L;
    public JdbcConnectionFailureException(String message) {
      super(message);
    }
    public JdbcConnectionFailureException(Throwable throwable) {
      super(throwable);
    }
  }
  private static int JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS = 3;
  public static Connection getJdbcConnection(
      JdbcConnectionParameters jdbcConnectionParameters)
      throws JdbcConnectionFailureException {
    try {
      if (jdbcConnectionParameters
          .driverNeedsHelpRegisteringUsingClassForName()) {
        Class.forName(jdbcConnectionParameters
            .getClassForNameDriverRegistrationString());
      }
      Connection jdbcConnection =
          DriverManager.getConnection(jdbcConnectionParameters
              .getJbdcConnectionUrl());
      if (!jdbcConnection
          .isValid(JdbcConnectionManager.JDBC_CONNECTION_VALIDATION_TIMEOUT_IN_SECONDS)) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            JdbcConnectionManager.JdbcConnectionFailureException.JDBC_CONNECTION_INVALID_MESSAGE);
      }
      // TODO: perform further validation on the connection
      return jdbcConnection;
    } catch (ClassNotFoundException classNotFoundException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(
          classNotFoundException);
    } catch (SQLException sqlException) {
      throw new JdbcConnectionManager.JdbcConnectionFailureException(
          sqlException);
    }
  }
}

我在这里坚如磐石吗?有没有更好、更简洁/优雅/健壮的方法来确保“连接”永远不会“空”?

编辑:

我添加了 jdbcConnection.isValid() 检查,但省略了输入验证。我将在实际代码中执行此操作。

最佳答案

从 try block 内部返回连接会更清晰:

public static Connection getJdbcConnection(
              JdbcConnectionParameters jdbcConnectionParameters)
                                     throws JdbcConnectionFailureException {
    try {
        if (jdbcConnectionParameters.driverNeedsHelpRegisteringUsingClassForName()) {
            Class.forName(jdbcConnectionParameters
                                .getClassForNameDriverRegistrationString());
        }
        return DriverManager.getConnection(jdbcConnectionParameters
                   .getJbdcConnectionUrl());
        // TODO: perform further validation on the connection
    } 
    catch (ClassNotFoundException classNotFoundException) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            classNotFoundException);
    } 
    catch (SQLException sqlException) {
        throw new JdbcConnectionManager.JdbcConnectionFailureException(
            sqlException);
    }
}

编辑:回答有关死代码的问题:

jdbcConnection 在这个地方不能为 null,因为如果它为 null,则会在该行抛出一个 NPE

if (!jdbcConnection.isValid(...))

关于java - 确保*所有*代码路径返回有效的 JDBC 连接或抛出异常(禁止 "null"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10962822/

相关文章:

java - 从 BatchUpdateException 确定每行执行失败的原因

java - 如何在 Java JDBC 中处理异常?

java - 尝试从另一个类修改 JFrame 时出现空指针异常?

java - 从面板获取图形返回 null

java - ComboBox 占位符 NullPointerException JavaFX

java - Spring 3.1 contextInitializerClasses 不能使用 web.xml Context-Param 在 WebLogic 10.3.6 上工作

java - 创建一个具有多层的按钮

java - 在java中创建DIV

java - 如何制作一个也考虑元素内容的优先级队列?

mysql - Opensearchserver 按字段排序