Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Простой вопрос про finally / 25 сообщений из 124, страница 1 из 5
27.08.2012, 14:18:31
    #37931810
stepplerus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
Добрый день.

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
27.08.2012, 14:22:16
    #37931825
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
Код: 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
27.08.2012, 14:26:31
    #37931835
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
stepplerus,
почитайте про области видимости переменных, try и finally тут ни при чем.
...
Рейтинг: 0 / 0
27.08.2012, 14:30:09
    #37931848
stepplerus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
ТимоН,

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

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

Тем не менее:

CopyPictureCatalog.java:157: variable WorkFile might not have been initialized
if (WorkFile != null) {
^
1 error
...
Рейтинг: 0 / 0
27.08.2012, 14:45:12
    #37931885
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
stepplerus, не может быть, сам только что проверил
...
Рейтинг: 0 / 0
27.08.2012, 14:48:24
    #37931895
ТимоН
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
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
27.08.2012, 14:48:58
    #37931899
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
Добрый день, 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
27.08.2012, 14:51:24
    #37931900
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
Тем не менее,
javapeckertry и finally тут ни при чем.
В джаве просто запрещено использование неинициализированных локальных переменных.
...
Рейтинг: 0 / 0
27.08.2012, 14:51:34
    #37931901
stepplerus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
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
27.08.2012, 14:52:12
    #37931903
stepplerus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
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
27.08.2012, 14:53:15
    #37931906
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
stepplerus, не устарела, вы просто еще невнимательнее чем я)
...
Рейтинг: 0 / 0
27.08.2012, 14:54:29
    #37931907
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
Ну во-первых в 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
27.08.2012, 15:01:49
    #37931918
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
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
27.08.2012, 15:14:09
    #37931941
stepplerus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простой вопрос про finally
grasoff.net,

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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


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