Java пробная окончательная конструкция - PullRequest
1 голос
/ 27 октября 2011

Может ли кто-нибудь объяснить мне ситуацию (пример), когда мы можем использовать эту конструкцию?

try{

        //dangerous code here
    } finally {

        //always called    
    }

Я действительно понимаю, как это работает, но в реальной ситуации это новое использование.

Ответы [ 11 ]

3 голосов
/ 27 октября 2011

Практически каждый раз, когда у вас есть что-то вроде Closeable, где вам нужно явно вызвать close(), чтобы освободить базовый ресурс, вы хотите поместить этот вызов в блок finally, как:

FileReader f = whatever();
try {
    // do some stuff with f
    return;
}
finally {
    f.close();
}

Даже если исключение не выдается, а return внутри блока try запущен, ресурс все равно будет корректно закрыт.

2 голосов
/ 27 октября 2011
try {
    isWorking = true
    //doStuff that might or might not succeed
    } finally {
    isWorking = false;
    }

другой пример:

public void actionPressed()
  {
    if( isLoading )
      return;
    try {
    isLoading= true;
    doTheLoad);
    } finally {
    isLoading = false;
    }    
  }
2 голосов
/ 27 октября 2011

Хорошо, допустим, вы открываете соединение с базой данных и делаете несколько запросов.Если по одному из запросов выдается SQLException, вы должны закрыть соединение, прежде чем делать что-то еще.Если исключение не выдвинуто, вы все равно должны его закрыть.Таким образом, try {} catch () {} существует для того, чтобы перехватить эти SQLExceptions и что-то с ними сделать, в то время как finally {} существует для закрытия соединения в любом случае.Это был бы очень распространенный сценарий, но то же самое верно для любого ресурса, который необходимо освободить независимо от того, что происходит при его использовании.

2 голосов
/ 27 октября 2011

Особенно мы можем использовать для подключения к базе данных закрыть связанный код в блоке finally.если программа выдает какое-либо исключение, в этом случае соединение с БД будет освобождено.

Этот пример в JDBC.same может быть применен в session.close () в Hibernate.попробуйте {

    //dangerous code here 
} catch(Exception e){
  //Do some thing releted to your exception
} finally { 
  //close DB connection or close your hibernate session.

    //always called     
}
2 голосов
/ 27 октября 2011

Посмотрите на эту статью, Обработка исключений Java - Основы . Здесь четко описано об исключении и где оно используется.

2 голосов
/ 27 октября 2011

Это очень распространенный шаблон:

InputStream stream = // acquire stream...

try {
  // do stuff with stream that might throw...
}
finally {
  IOUtils.closeQuietly(stream);
}

Примечание. IOUtils - это библиотека проекта Apache Commons.Вы всегда должны закрывать поток в finally.closeQuietly ест любые исключения, которые могут быть выброшены при попытке закрыть поток (что нормально, потому что вы ничего не можете с этим поделать).

2 голосов
/ 27 октября 2011
openFile();
try {
    int i = Integer.parseInt(someString);
    String sub = someString.substring(2);
    System.out.println(i+sub);
}
finally {
    closeFile();
}

Как вы можете видеть, во время прохождения кода может быть выдано несколько исключений, и вы, возможно, не захотите перехватывать каждое из них.

также может быть выдана ошибка, которую вы не должны ловить!

любым способом, которым вы хотите закрыть файл, до завершения метода, поэтому вы помещаете это в блок finally

2 голосов
/ 27 октября 2011

Например, когда вы читаете файл:

InputStream is = new FileInputStream("...");
try {
    // do stuff
}
finally {
    is.close();
}

Таким образом, ваш файл всегда закрыт, даже если есть исключение.

2 голосов
/ 27 октября 2011

Вот пример:

InputStream in = new FileInputStream(...);
try {
    / * use in here */
} finally {
    in.close();
}

По сути, что бы ни случилось, in всегда будет закрыт. Без этого in может оставаться открытым, пока сборщик мусора не соберет его (это может быть long time). Это проблема, потому что:

  • Существует ограничение на количество файлов / сетевых подключений, которые вы можете открыть одновременно
  • Открытые сетевые подключения продолжат связывать ресурсы и на удаленном конце (соединения с БД - хороший пример)
  • Закрытие входного потока также обычно сбрасывает его (сброс записывает что-либо в буфер входного потока)
2 голосов
/ 27 октября 2011

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

try{
     // Do something I care about
} finally {
    // Make sure we clean up, regardless of success or failure   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...