Java исключение, о котором не сообщают,

При изучении Java я натыкаюсь на эту ошибку довольно часто. Это идет как это:

Исключение, о котором не сообщают, java.io. Исключение FileNotFound; должен быть пойман или, как объявлять, брошен.

java.io. FileNotFound является просто примером, я видел много различных. В данном случае код, вызывающий ошибку:

OutputStream out = new BufferedOutputStream(new FileOutputStream(new File("myfile.pdf")));

Ошибка всегда исчезает и компиляции кода и работает успешно, после того как я поместил оператор в блоке попытки/выгоды. Иногда это достаточно хорошо для меня, но иногда нет.

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

Что более важно, иногда когда я поместил целый код в попытке/выгоде, это не может работать вообще. Например, в данном случае мне нужно к out.close (); в наконец {} блок; но если оператор выше себя в попытке {}, наконец {} не "видит" и таким образом не может закрыть его.

Моя первая идея состояла в том, чтобы импортировать java.io. FileNotFound; или другое соответствующее исключение, но это не помогло.

7
задан Sejanus 19 January 2010 в 06:49
поделиться

2 ответа

Краткий ответ: Нет

немного дольше ответа: , когда вы можете булыжничать вместе кусочки кода здесь и там, которые помогут вам получить большую часть того, что вы хотите в IE6, проблема в том, что ни одна из этих технологий нет идеально (с Большинство исправлений PNG - попробуйте использовать прозрачные PNG на фоновом изображении и измените фоновое изображение, изменив класс). Могут быть решения для округлых углов или теней, но они, вероятно, тоже будут глючить.

Многие JavaScript Frameworks предлагают почти полную поддержку функции JavaScript для IE6, но дело не то же самое для CSS. Многие вещи в продвинутых CSS (2 и 3) никогда не будут возможно в IE6, но должны быть достигнуты по-разному. Не существует недвижимости , : Hover работает только на якорных тегах, на основе атрибутов Pseudo селекторы не работают.

Даже технологии, такие как GWT, которые легко компилируют JavaScript для всех браузеров, предлагают условные CSS, чтобы вы могли кодировать свои собственные взломать или изящную деградацию.

-121--4859817-

То, что вы имеете в виду , проверенные исключениями , то есть они должны быть объявлены или обработаны. Стандартная конструкция для борьбы с файлами в Java выглядит что-то подобное:

InputStream in = null;
try {
  in = new InputStream(...);
  // do stuff
} catch (IOException e) {
  // do whatever
} finally {
  if (in != null) {
    try {
      in.close();
    } catch (Exception e) {
    }
  }
}

Это уродливо? Конечно. Это многословный? Конечно. Java 7 сделает его немного лучше с блоками руки, но до тех пор, пока вы застряли с вышеупомянутым.

Вы также можете позволить абоненту разбираться исключениями:

public void doStuff() throws IOException {
  InputStream in = new InputStream(...);
  // do stuff
  in.close();
}

Хотя даже тогда близко () , вероятно, должен быть завернут в блок , наконец, .

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

12
ответ дан 6 December 2019 в 15:22
поделиться

Проверенные исключения Java делают программисты решения проблем такими. (Это хорошо, на мой взгляд, даже если подметание ошибок под ковром проще.)

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

Ресурс должен быть обработан правильно, что требует вида:

acquire();
try {
    use();
} finally {
    release();
}

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

Итак, у нас есть два разных вопроса. К сожалению, синтаксис Java смешивает два. Правильный способ написания такого кода:

try {
    final FileOutputStream rawOut = new FileOutputStream(file);
    try {
        OutputStream out = new BufferedOutputStream(rawOut);
        ...
        out.flush();
    } finally {
        rawOut.close();
    }
} catch (FileNotFoundException exc) {
    ...do something not being able to create file...
} catch (IOException exc) {
    ...handle create file but borked - oops...
}
2
ответ дан 6 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: