Не в состоянии эффективно использовать Multi Catch из Java

Я действительно хочу использовать функции Java-1.7. Одной из таких функций является "Multi-Catch". В настоящее время у меня есть следующий код

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException numExcp) {
    numExcp.printStackTrace();
} catch (Exception exception) {
    exception.printStackTrace();
} 

Я хочу удалить два блока catch из приведенного выше кода и вместо этого использовать одиночный catch, как показано ниже:

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (Exception | NumberFormatException ex) { // --> compile time error
    ex.printStackTrace();
} 

Но приведенный выше код дает ошибку времени компиляции:

NumberFormatException уже перехвачено альтернативным исключением.

Я понял вышеупомянутую ошибку времени компиляции, но что заменит мой первый блок кода.

7 ответов

NumberFormatException это подкласс Exception, Сказать, что оба catch блоки должны иметь такое же поведение, как сказать, что у вас нет особого отношения к NumberFormatException, то же самое общее лечение у вас Exception, В этом случае вы можете просто опустить его catch блок и только catch Exception:

try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
} catch (Exception exception) {
    exception.printStackTrace();
} 

Компилятор говорит вам, что

} catch (Exception ex) {

также будет ловить NumberFormatException исключения, потому что java.lang.NumberFormatException продолжается java.lang.IllegalArgumentException, который расширяет java.lang.RuntimeExceptionкоторый в конечном итоге расширяется java.lang.Exception,

Типы в multi-catch должны быть непересекающимися и java.lang.NumberFormatException это подкласс java.lang.Exception,

Чтобы добавить к решению Mureinik:

Если вы хотите дифференцировать обработку ошибок для каждого из подклассов, которые вы можете использовать instanceof в блоке catch что-то вроде:

FileNotFoundException is subclass of IOException

catch (IOException e) {
            if (e instanceof FileNotFoundException)
            {
                System.out.println("FileNotFoundException");
            }
            else if(e instanceof IOException)
            {
                System.out.println("IOException");
            }

        }

Ты можешь использовать

    try {
    int Id = Integer.parseInt(idstr);

    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));

    updateTotalCount(tempTypeInfo);
  } catch (Exception exception) {
    exception.printStackTrace();
  } 

В этом случае multi-catch не требуется, потому что NumberFormatException происходит от Exception, Вы можете просто поймать только Exception чтобы получить их обоих. Если вам нужна другая обработка для NumberFormatException чем для других исключений, вы должны использовать пример, который вы опубликовали в первую очередь.

Exception является родительским классом всех исключений и в идеале (Предпочтительный подход - Best Coding Practice), вы никогда не должны ловить Exception если вы не уверены, что будет выброшено во время выполнения в блоке try.

Поскольку в вашем коде вы выполняете операцию NumberFormat, являющуюся дочерним классом Exception, вы не должны перехватывать Exception (если другие 2 метода не могут генерировать непроверенное исключение) и вместо этого использовать:

try {
    int Id = Integer.parseInt(idstr);
    TypeInfo tempTypeInfo = getTypeInfo(String.valueOf(Id));\
    updateTotalCount(tempTypeInfo);
} catch (NumberFormatException npe) {
    npe.printStackTrace();
} 
Другие вопросы по тегам