powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой вопрос про finally
25 сообщений из 124, страница 1 из 5
Простой вопрос про finally
    #37931810
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

JAVA я начал осваивать недавно, поэтому многие вещи в ней мне кажутся, мягко говоря, странными.

Например.

У меня есть некий метод, в котором я сначала создаю некий файл, потом что-то с ним делаю, в самом конце мне его нужно удалить.
Без особых сомнений пришу следующий код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public void processFile (String Name) trows IOException {
    File WorkFile;

    try {
       WorkFile = new File (Name);
       ....
    }
    catch ...
    finaly {
       if (WorkFile.exists()) { WorkFile.delete(); }
    }
}



На что компилятор (видимо, резонно) возражает мне - "переменная WorkFile может быть не определена".
Я даже, где-то с ним согласен. В другом языке я написал бы что-то вроде if valid-handle(WorkFile) или if WorkFile != null, и был бы счастлив. Но тут, если я все правильно понимаю, ничего из этого мне не поможет.

Получается, что в finally нельзя использовать никакие переменные, которые были инициализированы в разделе try этой же процедуры.
Собственно, вопрос - а что вообще можно использовать в секции finally? И как правильно следует решать задачи подобные приведенной?

ЗЫ. Написать в finally TempFile = new File (Name) не предлагайте, это тривиально и мало где подойдет.

Спасибо.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931825
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public void processFile (String Name) trows IOException {
    File WorkFile = null;

    try {
       WorkFile = new File (Name);
       ....
    }
    catch ...
    finaly {
       if (WorkFile != null && WorkFile.exists()) { WorkFile.delete(); }
    }
}
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931835
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerus,
почитайте про области видимости переменных, try и finally тут ни при чем.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931848
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТимоН,

Увы, так тоже не работает. Та же ошибка.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931854
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее не про видимость переменных, так как с этим тут все в порядке, а с выделением памяти в Java.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931856
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker,

Что не так с видимостью? С видимостью все хорошо. Переменная WorkFile, безусловно, видна внутри finally. Но вот с ее инициализацией, действительно, могу быть проблемы. Кстати, при неверно понятой области видимости, ошибка была бы другая: "символ не найден".
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931859
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerus,
прощу прощения, невнимательно посмотрел
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931868
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusУвы, так тоже не работает. Та же ошибка.
не может быть, проверьте еще раз.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931876
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТимоН,

Тем не менее:

CopyPictureCatalog.java:157: variable WorkFile might not have been initialized
if (WorkFile != null) {
^
1 error
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931885
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerus, не может быть, сам только что проверил
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931895
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusТимоН,

Тем не менее:

CopyPictureCatalog.java:157: variable WorkFile might not have been initialized
if (WorkFile != null) {
^
1 error
Присвоить значение переменной не забыли?
Код: java
1.
2.
3.
...
File WorkFile = null;
...
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931899
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, stepplerus!
> Автор: stepplerus. ТимоН,
>
> Тем не менее:

Точно в третьей строке написано
Код: sql
\r\nFile WorkFile = null;\r\n
\r\n а не
как было,
Код: sql
\r\nFile WorkFile;\r\n
\r\n?


--
Алексей
JID: alxt@ya.ru


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931900
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем не менее,
javapeckertry и finally тут ни при чем.
В джаве просто запрещено использование неинициализированных локальных переменных.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931901
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javapecker,

Вот, простой пример:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.io.*;

public class TestClass {

   public TestClass () {}

   public void TestMethod (String Name) throws IOException, Exception  {
      File WorkFile;
      try {
         WorkFile = new File (Name);
      }
      catch( Exception Exc ) {
         Exc.printStackTrace();
      }
      finally{
         if ( WorkFile != null) {
         }
      }
   }
}



У меня ошибка воспроизводится.
Моя ЯВА так устарела?
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931903
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GKS_SamaraДобрый день, stepplerus!
> Автор: stepplerus. ТимоН,
>
> Тем не менее:

Точно в третьей строке написано
Код: sql
\r\nFile WorkFile = null;\r\n
\r\n а не
как было,
Код: sql
\r\nFile WorkFile;\r\n
\r\n?


Воооот!!!

Спасибо.
--
Алексей
JID: alxt@ya.ru
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931906
javapecker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerus, не устарела, вы просто еще невнимательнее чем я)
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931907
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну во-первых в java принято называть переменные с маленькой буквы File workFile = .. Так легче визуально отличить вызов статических методов от нестатических.
Далее, если ваша задача конкретно поработать с файлом потом удалить его, то лучше делать такЖ
Код: java
1.
2.
3.
4.
File temp = File.createTempFile("pattern", ".suffix");

    // Delete temp file when program exits.
    temp.deleteOnExit();



Третье, вариант Тимона должен работать, вы его хоть пытались запустить?
Четвертое, вам действительно надо разобраться с моментом выделения памяти под объекты. В java обьявление переменной это всего лишь обьявление, память при этом не выделяется, особым случаем является присваивание ссылке значения null. Компилятор вам всем правильно говорит. Классическая идиома такая:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Object obj = null;
try{
obj = init();
}catch(Exception e){
//handle
}finally{
if(obj != null){
obj.cleanup();
}
}
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931918
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusjavapecker,

Вот, простой пример:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.io.*;

public class TestClass {

   public TestClass () {}

   public void TestMethod (String Name) throws IOException, Exception  {
      File WorkFile;
      try {
         WorkFile = new File (Name);
      }
      catch( Exception Exc ) {
         Exc.printStackTrace();
      }
      finally{
         if ( WorkFile != null) {
         }
      }
   }
}




У меня ошибка воспроизводится.
Моя ЯВА так устарела?чоза тупняк-то вконце концов

Код: plaintext
1.
2.
3.
4.
5.
6.
1. File WorkFile; // в этом месте переменная не инициализирована совсем

2. try {
         WorkFile = new File (Name); // в этом месте конструктор File может выбросить исключение и переменная WorkFile останется неинициализированой ( это ведь каждом читателю понятно, да? )

3. finally{
         if ( WorkFile != null) { // компилятор, исходя из п.2, сообщает о том, что переменная WorkFile может быть не определена

что тут странного-то?
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37931941
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grasoff.net,

Да, в общем, уже все хорошо.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932203
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, странная эта штука - Java.

С одной строны, есть метод renameTo(), который переименовывает даже между различными устройствами (чего ни одна ОС не делает). То есть, сначала этот метод честно копирует в целевой файл, а потом удаляет исходный файл, походу теряя атомарность операции rename. А с другой стороны, нет метода copyTo(), который надо делать самому. Вот, кто бы объяснил, почему?

"И так у них все" (С)
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932231
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusА с другой стороны, нет метода copyTo()Если кровь-из-носу надо, чтобы было в rt.jar - Java SE 7 .
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932313
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, stepplerus!

> Вот, кто бы объяснил, почему?

Авторы Явы были очень плохими архитекторами.
Что можно- поправили, что нет- осталось криво.

Но хорошо то, что есть кому предлагать хорошие идеи и их слушают.
Тем и хороша.

--
Алексей
JID: alxt@ya.ru


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932362
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stepplerusНе, странная эта штука - Java.

С одной строны, есть метод renameTo(), который переименовывает даже между различными устройствами (чего ни одна ОС не делает). То есть, сначала этот метод честно копирует в целевой файл, а потом удаляет исходный файл, походу теряя атомарность операции rename. А с другой стороны, нет метода copyTo(), который надо делать самому. Вот, кто бы объяснил, почему?

"И так у них все" (С)

потому что жаба изначально предполагалась кроссплатформенным средством. Оно может запускаться там где файловой системы вообще нет (банковские карты, телефоны), там где к файлам нет никакого доступа (вебстарт, апплеты), там где с файлами работают совершенно иначе (под досом и виндовс ранними, например, у файлов нет владельца).
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932380
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот понять бы еще, как со всей этой фигней ява стала промышленным стандартом.
...
Рейтинг: 0 / 0
Простой вопрос про finally
    #37932388
stepplerus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot 1024]stepplerusНе, странная эта штука - Java.

потому что жаба изначально предполагалась кроссплатформенным средством. Оно может запускаться там где файловой системы вообще нет (банковские карты, телефоны), там где к файлам нет никакого доступа (вебстарт, апплеты), там где с файлами работают совершенно иначе (под досом и виндовс ранними, например, у файлов нет владельца).

Кстати, про владельцев.

1. Отбираю (в XP) у себя права на каталог, и File.listFiles() возвращает null, в то время как а я жду Exception. Ладно, оставим так.
2. Отбираю (в XP) у себя права на файл, все становится еще интреснее. Внутри одного устройства файл (неожиданно) переносится благополучно, сохраняя при этом все свои "запретительные" атрибуты. На другое устройство файл уже не переносится (ожидаемо), но при этом так же не происходит Exception, просто метод переноса возвращает false вместо true. Я что-то пропускаю в списке throw? Хотелось бы видеть, что именно происходит, а не просто "не шмогла".

Спасибо.
...
Рейтинг: 0 / 0
25 сообщений из 124, страница 1 из 5
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой вопрос про finally
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]