powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / улучшенная обработка исключение в java 7
25 сообщений из 29, страница 1 из 2
улучшенная обработка исключение в java 7
    #38735311
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html#rethrow
In detail, in Java SE 7 and later, when you declare one or more exception types in a catch clause, and rethrow the exception handled by this catch block, the compiler verifies that the type of the rethrown exception meets the following conditions:

The try block is able to throw it.
There are no other preceding catch blocks that can handle it.
It is a subtype or supertype of one of the catch clause's exception parameters.


Что хотели сказать этой строчкой?
авторThere are no other preceding catch blocks that can handle it
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38735349
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исключения обрабатываются по принципу "первый подходящий" (порядок следования в тексте программы), а не по принципу "наиболее подходящий" (иерархия наследования).
Соответственно, если родительский тип в блоке catch (текстуально) предшествует дочернему, то "более подходящий" блок catch с этим дочерним типом не будет использован, а компилятор объявит такую последовательность ошибкой.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38735511
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

а разве в тексте про это написано?
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38735605
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в тексте про новую фичу (возможность перечислить несколько типов исключений в одном блоке catch) должны объясняться базовые вещи языка, которые читающий и так должен знать???
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736055
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

согласен, поэтому мне и кажется упоминание этой штуки в этой статье.

И вообще я не уверен, что речь именно об этой штуке.

ещё раз читаем.Вот мой вольный перевод:
....компилятор проверяет что тип rethrown exception отвечает следующим условиям
-...
-There are no other preceding catch blocks that can handle it. Отстутвуют предшествующие catch блоки которые могут его обработать.
-...

Теперь как я это понял:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
           public static void main(String[] args) throws FileNotFoundException {
		try {
                       throw new FileNotFoundException();
                } catch (FileNotFoundException e) {
                       e.printStackTrace();
                } catch (IOException e) {
                       throw new FileNotFoundException();//либо даже throw e;
                }
	   }




Мне кажется, что тут я нарушил это правило, а компилятор молчит
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736057
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
**согласен, поэтому мне и кажется упоминание этой штуки в этой статье странным.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736093
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Мне кажется, что тут я нарушил это правило, а компилятор молчитВы путаетесь в иерархии: IOException - предок, FileNotFound - потомок.
Конкретно предка вы обрабатываете так, а все остальные исключения ввода-вывода - эдак. Именно в таком порядке они и указаны в тексте.
Так как любое исключение ввода-вывода может быть приведено к (родительскому) IOException, то можно, не конкретизируя, указать его в блоке catch. Этот блок и перехватит все исключения ввода-вывода.
Если после такого блока поставить ещё один catch-блок с более конкретным типом (ФилеНотФоунд, например), то компилятор укажет, что второй блок недостижим, а такой мёртвый код считается ошибкой.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736204
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov,

ну хватит уже. Не путюсь я в иерархии.

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

авторtype of the rethrown exception meets the following conditions:

ещё раз напишу, чтобы точно было видно авторtype of the rethrown exception

Давайте я немного поясню фичу о которой идёт речь. Я начинаю сомневать в том, что вы ее понимаете.

Код: java
1.
2.
3.
4.
5.
6.
7.
 public static void main(String[] args) throws FileNotFoundException {
		try {
                      throw new FileNotFoundException();
                catch (IOException e) {
                     throw e; // обратим внимание, что кетчим мы тут IOException, а во throws всё равно можно писать FileNotFoundException
                }
	 }
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736251
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Давайте я немного поясню фичу о которой идёт речь. Я начинаю сомневать в том, что вы ее понимаете.

Код: java
1.
2.
3.
4.
5.
6.
7.
 public static void main(String[] args) throws FileNotFoundException {
		try {
                      throw new FileNotFoundException();
                } catch (IOException e) {
                     throw e; // обратим внимание, что кетчим мы тут IOException, а во throws всё равно можно писать FileNotFoundException
                }
	 }


Кстати, это и есть ответ на Ваш вопрос.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736262
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну чтобы совсем было понятно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public static void main(String[] args) throws FileNotFoundException {
		try {
                       throw new FileNotFoundException();
                } catch (FileNotFoundException e) {
                       e.printStackTrace();
                } catch (IOException e) {
                    if (e instanceof FileNotFoundException) {
                       FileNotFoundException e2=(FileNotFoundException) e;
                       throw e2;
                    }   
                }
	   }
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736326
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

а можно для тех кто в танке ещё раз объяснить.

в доке, на которую я ссылаюсь написано

авторкомпилятор проверяет что тип rethrown exception отвечает следующим условиям:
-There are no other preceding catch blocks that can handle it.

Не понимаю, правда.

Как компилятор проверяет?
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736358
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

ну то есть по вашему примеру этот пункт как раз таки не выполняется ибо вываливаем FileNotFounException и пишем его во throws, который уже отлавливаем.

Ожидаемый результат - ошибка компиляции. разве нет?
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736375
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

так 6 компилит, а 7ка вешает варнинг:
javacTest.java:10: warning: unreachable catch clause
} catch (IOException e) {
^
thrown type FileNotFoundException has already been caught

надо только не путать rethrown и throw new.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736377
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

в принципе на оригинальном примере тоже самое.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736494
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

да тут по ходу в другом дело.

автор...src\main\java\exceptionsAndAssertions>javac RethowTest.java
RethowTest.java:13: unreported exception java.io.IOException; must be caught or declared to be thrown
throw e;
^
1 error

а в еклипсе вполне себе работает:

авторpublic class RethowTest {
public static void main(String[] args) throws FileNotFoundException {
try {
throw new FileNotFoundException();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
throw e;
}
}
}
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736498
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а тут нормально компилится:

http://ideone.com/Cw8zlk
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736626
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90,

я не ту ошибку скопировал

javacTest.java:15: error: exception FileNotFoundException has already been caught
} catch (FileNotFoundException e) {

вылезает на
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	try { 
          if ((new Random()).nextInt()>105) {
            throw new FileNotFoundException();
	  } else {
            throw new IOException();
	  }
        } catch (IOException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
	}


В обратном порядке не вылезает.
Если же оставить только один throw new FileNotFoundException(); то компилятор догадывается, что других не будет и
Код: java
1.
2.
3.
4.
5.
} catch (FileNotFoundException e) {
          e.printStackTrace();
} catch (IOException e) {
          e.printStackTrace();
}


Все равно решит, что перехвачено.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736651
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	try { 
          if ((new Random()).nextInt()>105) {
            throw new FileNotFoundException();
	  } else {
            throw new IOException();
	  }
        } catch (IOException e) {
          e.printStackTrace();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
	}



тут то ежу понятно, что нет смысла отлавливать более специфичный эксепшн после более общего.

А по поводу именно такого кода:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public static void main(String[] args) throws FileNotFoundException {
		try {
			throw new FileNotFoundException();
		} catch (FileNotFoundException e) {
			
		} catch (IOException e) {
			throw e;
		}
	}




Эклипс, который смотрит на 7 джаву - работает.
из cmd:

авторD:\DNN-Project\DNN-Project\src\main\java\exceptionsAndAssertions>java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)

D:\DNN-Project\DNN-Project\src\main\java\exceptionsAndAssertions>javac RethowTest.java
RethowTest.java:13: unreported exception java.io.IOException; must be caught or declared to be thrown
throw e;
^
1 error


онлайн компилятор1:
http://ideone.com/Cw8zlk - работает(не ясно на какой он джаве)

онлайн компилятор2:
http://www.compileonline.com/compile_java_online.php

выдает другой результат:
авторHelloWorld.java:9: warning: unreachable catch clause
} catch (IOException e) {
^
thrown type FileNotFoundException has already been caught
1 warning
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736681
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё равно не понял ваших проблем ...
В некоторых случаях компилятор может проанализировать фактический тип проверяемых исключений и позволить некоторую неряшливость. В вашем примере:
Код: sql
1.
2.
3.
... throws IOException {
...
catch ( Exception ex ) { throw e }

Формально - нарушение спецификации исключений, фактически - нет, если анализ пропущенного текста показывает, что ничего кроме IOException в ex оказаться не может.
Или что?
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736705
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Это человеку понятно, он не может понять из англицкого текста, что rethrow в блоке catch может быть в другом блоке try (обертывающем первый try...catch) и соответственно быть им поймана, а посему может не выноситься в описание метода.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736720
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевrethrow в блоке catch может быть в другом блоке try (обертывающем первый try...catch) и соответственно быть им поймана, а посему может не выноситься в описание метода.Так, вроде, всегда было. В каком месте тут улучшение?
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736724
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Арсеньев,
как вы из этого
авторThere are no other preceding catch blocks that can handle it.
это поняли?
авторrethrow в блоке catch может быть в другом блоке try (обертывающем первый try...catch) и соответственно быть им поймана, а посему может не выноситься в описание метода.


==================

Немного в сторону, но заметьте что этот код в отличии от версии(подверсии) седьмой джавы может вернуть либо варнинг либо ошибку компиляции
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class RethowTest {

		public static void main(String[] args)  {
	        try {
	        	throw new FileNotFoundException();
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        } catch (IOException e) {
	            throw e;
	        }
		}    
}
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736730
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в 1.7.0_60-b19 эта фича вообще не работает
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736757
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в 1.7.0_60-b19 эта фича вообще не работает - ошибся? на самом деле это была 1.6.

Видимо ответ на изначальный вопрос такой:

компилятор действительно проверяет достижимость catch блоков более продвинуто, чем в 6 джаве и генерирует, внимание, WARNING если catch блок недостижим.
...
Рейтинг: 0 / 0
улучшенная обработка исключение в java 7
    #38736763
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90, попробуй еще

Код: java
1.
catch(FileNotFoundException | IOException e)


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


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