try-catch-finally-исключение в Java - PullRequest
       13

try-catch-finally-исключение в Java

0 голосов
/ 11 августа 2010

Я новичок в Java, но я подумал, что при использовании try-catch-finally мне не нужно объявлять исключение, используя throws SQLException. Однако, если я не использую его, компилятор выдаст мне ошибку:

"незарегистрированное исключение java.sql.SQLException; должно быть перехвачено или объявлено как выброшенное".

Я включил улов, поэтому я не уверен, почему эта ошибка возникает.

public static ResultSet getResultSet ( String query ) 
{
    dbConn = getConnection();

    try
    {
       stmt = dbConn.createStatement( );

       ResultSet rs = stmt.executeQuery( query );

       return rs;
    }
   catch (SQLException ex)
   {
       return null;
   }
   finally
   {
       stmt.close();
       dbConn.close();
   }
}

Ответы [ 4 ]

9 голосов
/ 11 августа 2010

Это потому, что методы close():

stmt.close();
dbConn.close();

может выдать SQLException, и вы не заключили их в блок try / catch.

Метод может очень хорошо генерировать исключение из предложения finally, и, без предложения catch, обрабатывающего эти исключения, метод должен быть объявлен для выброса этих исключений.

По сути, вам нужно сделать что-то вроде

finally
{
    try {
        stmt.close();
    } catch (SQLException sqle) {
        // log the statement-close exception
    }

    try {
        dbConn.close();
    } catch (SQLException sqle) {
        // log the connection-close exception
    }
}
4 голосов
/ 11 августа 2010

Поместите dbConn = getConnection(); в раздел try. Он также может выбросить SQLException.

2 голосов
/ 11 августа 2010

Помимо ошибок компилятора, этот код не будет работать во время выполнения.

Когда вы закрываете Connection, из которого создается ResultSet, ResultSet будет недействительным, и любые вызовы будутэто не удастся.(Конечно, какой-то странный драйвер JDBC должен быть реализован, чтобы это могло работать, но это некорректное использование JDBC API.)

Область действия и время жизни ResultSet не могут быть шире, чем его родительConnection и Statement.

0 голосов
/ 11 августа 2010

Код, который вы написали, использует класс с типом исключения, которое должно быть обработано. Вы можете сделать это одним из двух способов, передав его по цепочке, то есть повторно выдав исключение, или фактически обработав его, как показывают некоторые другие комментарии, поместив методы close в catch-запрос try собственного элемента в finally. блок.

Как правило, вы увидите это в файловых классах ввода-вывода, где вы всегда должны закрывать объект или поток, чтобы гарантировать, что вы оставите его в действительном состоянии. В противном случае вы оставляете это на усмотрение операционной системы.

...