Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可关闭资源的选择性捕获_Java_Checked Exceptions_Autocloseable - Fatal编程技术网

Java 可关闭资源的选择性捕获

Java 可关闭资源的选择性捕获,java,checked-exceptions,autocloseable,Java,Checked Exceptions,Autocloseable,这更像是一个语法/结构问题。 我正在使用JDBC:语句和结果集,这意味着到处都会抛出SQLExceptions 我的代码如下所示: private static final String MY_QUERY = "SELECT * FROM MY_TABLE"; public void lookAtMetadata() throws SQLException { try (Statement myStatement = getStatement) { try (ResultS

这更像是一个语法/结构问题。 我正在使用JDBC:
语句
结果集
,这意味着到处都会抛出
SQLExceptions

我的代码如下所示:

private static final String MY_QUERY = "SELECT * FROM MY_TABLE";

public void lookAtMetadata() throws SQLException { 
  try (Statement myStatement = getStatement) 
  {
    try (ResultSet myResultSet = myStatement.executeQuery(MY_QUERY)) 
    {
      ResultSetMetadata metadata = myResultSet.getMetaData();
      // do other stuff with metadata
    }
  }
}
到目前为止还不错。 但是当
myStatement.executeQuery(我的查询)
失败时,我想抛出一个特殊异常,如下所示:

ResultSet myResultSet = null;
try 
{
  myResultSet = myStatement.executeQuery(MY_QUERY);
  // get metadata and do stuff 
} catch (SQLException e) 
{
  throw new MySpecialException(e);
} finally 
{
  if (myResultSet != null) myResultSet.close();
}
问题是,涉及
ResultSetMetaData
的其他操作也可能抛出
SQLException
,我不想用
MySpecialException
包装这些操作


是否有一种方法可以让我只捕获来自查询执行的
SQLException
,并让其他
SQLExceptions
抛出给方法调用方?我还想正确关闭
ResultSet

使用嵌套的try结构,内部try仅包装
executeQuery
。将catch处理程序添加到此内部try。不使用catch处理程序保留外部try,这样它将按原样传播所有其他
SQLException
s

ResultSet myResultSet = null;
try 
{
  try {
      myResultSet = myStatement.executeQuery(MY_QUERY);
  } catch (SQLException e) {
      throw new MySpecialException(e);
  }
  // get metadata and do stuff 
} finally 
{
  if (myResultSet != null) myResultSet.close();
}

使用嵌套的try结构,内部try仅包装
executeQuery
。将catch处理程序添加到此内部try。不使用catch处理程序保留外部try,这样它将按原样传播所有其他
SQLException
s

ResultSet myResultSet = null;
try 
{
  try {
      myResultSet = myStatement.executeQuery(MY_QUERY);
  } catch (SQLException e) {
      throw new MySpecialException(e);
  }
  // get metadata and do stuff 
} finally 
{
  if (myResultSet != null) myResultSet.close();
}