Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Проблема с закрытием BufferedReader
Список форумов
 ->  Файлы и потоки ввода/вывода


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mako : 85
Новичок
Откуда: из мамы

СообщениеЯнв 05, 2012 14:05 
Ответить с цитатой
Как обычно, под конец дня начинаю плохо соображать. Вот кусок моего кода. ИДЕ выделяет скобки после слов "ЗакрытьФайл_УничтожитьБуфер" и пишет в строке состояния буквально следующее: "unreported exception java.io.IOException; must be caught or declared to be thrown".

Код:
import java.io.*;

public class ArrayReader
{
    private String ИмяФайла;
    private BufferedReader СтрокиФайла;
   
    public ArrayReader(String ИмяФайла)
    {
        this.ИмяФайла = ИмяФайла;
        СтрокиФайла = ОткрытьФайлКакБуфер();
    // бла-бла-бла...
        ЗакрытьФайл_УничтожитьБуфер();
    }

    private BufferedReader ОткрытьФайлКакБуфер()
    {
        FileReader Файл = null;
        BufferedReader Буфер = null;
        try
        {
            Файл = new FileReader(ИмяФайла);
            Буфер = new BufferedReader(Файл);
        }
        catch ( FileNotFoundException Исключение )
        {
            System.out.println("Файл " + ИмяФайла + " не найден!");
            System.exit(0);
        }
        return Буфер;
    }

    private void ЗакрытьФайл_УничтожитьБуфер() throws IOException
    {
        СтрокиФайла.close();
        СтрокиФайла = null;
    }
    // остальное неважно
}


Чего ж тебе надо, хороняка (это я к ИДЕ обращаюсь)? Я же написал на великом и могучем Вильяма нашего Шекспира: "throws IOException"!
К началу Посмотреть профиль Отправить личное сообщение
Mam(O)n : 61
Новичок

СообщениеЯнв 05, 2012 14:22 
Ответить с цитатой
В конструкторе ArrayReader(String) не отлавливается это исключение.
К началу Посмотреть профиль Отправить личное сообщение
Mako : 85
Новичок
Откуда: из мамы

СообщениеЯнв 05, 2012 14:37 
Ответить с цитатой
Mam(O)n писал(а):
В конструкторе ArrayReader(String) не отлавливается это исключение.


А там оно и возникнуть не может. У меня ведь всё отлавливается там, где проводятся соответствующие операции (открытие файла, закрытие файла; есть ещё чтение из файла, здесь оно не показано, но там тоже отлавливается через try-catch). Или надо отлавливать обязательно и МЕЖДУ этими операциями? Если так, то это странно.
_________________
Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков.
К началу Посмотреть профиль Отправить личное сообщение
evillive : 810
Постоянный посетитель

СообщениеЯнв 05, 2012 14:52 
Ответить с цитатой
Mako писал(а):
У меня ведь всё отлавливается там, где проводятся соответствующие операции

Как минимум в методе ЗакрытьФайл_УничтожитьБуфер() (ужос) ниче не отлавливается.
К началу Посмотреть профиль Отправить личное сообщение
Vantuz-Subhuman : 660
Постоянный посетитель
Откуда: издиснейленда

СообщениеЯнв 05, 2012 14:54 
Ответить с цитатой
Mako писал(а):
Или надо отлавливать обязательно и МЕЖДУ этими операциями? Если так, то это странно.


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

UPD: Проще говоря, если вы хотите, чтобы конструктор просто передавал возникшее исключение дальше, то объявите "throws" и в нём.
_________________
«One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»


Последний раз редактировалось: Vantuz-Subhuman (Янв 05, 2012 14:57), всего редактировалось 1 раз
К началу Посмотреть профиль Отправить личное сообщение
Mam(O)n : 61
Новичок

СообщениеЯнв 05, 2012 14:56 
Ответить с цитатой
Mako писал(а):

А там оно и возникнуть не может.
Оно возникает в СтрокиФайла.close(). Далее из функции ЗакрытьФайл_УничтожитьБуфер() по указанному throws передаётся выше в вызываемую функцию. А как раз из конструктора вызывается ЗакрытьФайл_УничтожитьБуфер(), где уже это исключение ни отлавливается, ни передаётся выше по стеку вызовов.
К началу Посмотреть профиль Отправить личное сообщение
Mako : 85
Новичок
Откуда: из мамы

СообщениеЯнв 06, 2012 10:40 
Ответить с цитатой
evillive писал(а):
Mako писал(а):
У меня ведь всё отлавливается там, где проводятся соответствующие операции

Как минимум в методе ЗакрытьФайл_УничтожитьБуфер() (ужос) ниче не отлавливается.


Почему? Там же написано: "throws IOException". Видимо, я действительно совершенно не понимаю сам смысл исключений...

UPD: Прочитал сообщения Vantuz-Subhuman и Mamm(0)n и начал прозревать. Я-то по наивности своей воспринимал throws и try-catch примерно как директивы компилятору - мол, обрати особое внимание на этот кусок кода, там может возникнуть исключение, надо его отловить. А это, скорее, ссылка на объект. Тогда смысла в методе ЗакрытьФайл_УничтожитьБуфер вообще нет, проще отлавливать исключения во всём конструкторе целиком. А мне это казалось избыточным решением. Ведь тогда получается, что IOException будут отлавливаться, например, во время операции Integer.parseInt.
_________________
Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеЯнв 10, 2012 23:26 
Ответить с цитатой
Mako писал(а):
Вот кусок моего кода. ИДЕ выделяет скобки после слов "ЗакрытьФайл_УничтожитьБуфер" и пишет в строке состояния буквально следующее


Знаете, я бы на ее месте после "ЗакрытьФайл_УничтожитьБуфер" написал "Закрыть IDE, уничтожить программиста". Вас кто научил переменные и функции по-русски называть?
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
ТокиТори : 1066
Завсегдатай

СообщениеЯнв 10, 2012 23:58 
Ответить с цитатой
Вроде как Борис Нуралиев начал этот тренд...
К началу Посмотреть профиль Отправить личное сообщение
rfq : 211
Новичок

СообщениеЯнв 11, 2012 7:33 
Ответить с цитатой
Skipy писал(а):
Знаете, я бы на ее месте после "ЗакрытьФайл_УничтожитьБуфер" написал "Закрыть IDE, уничтожить программиста". Вас кто научил переменные и функции по-русски называть?

Вообще-то язык написания идентификаторов - это не вопрос культуры программирования, а решение заказчика. Я когда на советский ВПК (военно-промышленный комплекс, если вы не в курсе) работал, то не только идентификаторы, но и служебные слова по русски писал (_если _то _иначе _все).
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеЯнв 11, 2012 11:46 
Ответить с цитатой
rfq писал(а):
Вообще-то язык написания идентификаторов - это не вопрос культуры программирования, а решение заказчика. Я когда на советский ВПК (военно-промышленный комплекс, если вы не в курсе) работал, то не только идентификаторы, но и служебные слова по русски писал (_если _то _иначе _все).


Ок. Напишите под win, перенесите под *NIX и скомпилируйте из командной строки. А потом посмотрите на результат.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
rfq : 211
Новичок

СообщениеЯнв 11, 2012 12:07 
Ответить с цитатой
Skipy писал(а):
Ок. Напишите под win, перенесите под *NIX и скомпилируйте из командной строки. А потом посмотрите на результат.

Без проблем. Надо только знать, в какой кодировке у тебя тексты, и сообщать об этом компилятору.
Создавая новый проект под Эклипсом, я сразу ставлю в нем любимую кодировку (UTF-8 ), и спокойно перемещаюсь между виндами и линуксом.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеЯнв 11, 2012 17:10 
Ответить с цитатой
Ну, в теории реально никаких проблем. Только количество вопросов по этому поводу таково, что мне пришлось отдельную статью писать про кодировки при компиляции.

А теперь представьте себе библиотеку, у классов которой методы названы по-русски. И ее использование, например, американцами. Их позабавят буквы "ю", "ж", "ы" и иже с ними. Если они их на клавиатуре найдут.

Исходный код должен умещаться в ASCII. Это правило, наработанное 15-ю годами разработки на Java. Всё остальное способно вызвать проблемы.

P.S. BTW, а если у Вас не Eclipse? Что с кодировками делать будете? Вот ничего нет, только notepad.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
rfq : 211
Новичок

СообщениеЯнв 11, 2012 19:22 
Ответить с цитатой
Skipy писал(а):
А теперь представьте себе библиотеку, у классов которой методы названы по-русски. И ее использование, например, американцами.

P.S. BTW, а если у Вас не Eclipse? Что с кодировками делать будете? Вот ничего нет, только notepad.


Если предполагается использование бибиотеки американцам, то они должны рассматриваться как заказчики, а про приоритет заказчиков я уже писал.

Насчет notepad'a не скажу - у меня AlkePad, и в нем есть установка кодировок.

Если честно, то сам я использую только ascii. Это хорошая практика. Но не настолько универсальная, чтобы за отступление от нее убивать программистов.
К началу Посмотреть профиль Отправить личное сообщение
Mako : 85
Новичок
Откуда: из мамы

СообщениеЯнв 11, 2012 19:36 
Ответить с цитатой
Skipy писал(а):
Знаете, я бы на ее месте после "ЗакрытьФайл_УничтожитьБуфер" написал "Закрыть IDE, уничтожить программиста". Вас кто научил переменные и функции по-русски называть?


Я бы на вашем месте избавился бы от послепраздничной депрессии и абстинентного синдрома, прежде чем с людьми общаться. Вас кто воспитывал, если вы такими словами кидаетесь, как "уничтожить"?
_________________
Вы не поверите, но Java - самый низкоуровневый из изучаемых мною языков.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Файлы и потоки ввода/вывода


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru