Невозможно эффективно использовать 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» уже перехвачено альтернативным исключением.

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


person M.S.Naidu    schedule 02.09.2015    source источник


Ответы (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();
} 
person Mureinik    schedule 02.09.2015

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

} catch (Exception ex) {

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

person Moishe Lipsker    schedule 02.09.2015

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

person akhil_mittal    schedule 02.09.2015

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

person Sleafar    schedule 02.09.2015

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

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

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

    updateTotalCount(tempTypeInfo);
  } catch (Exception exception) {
    exception.printStackTrace();
  } 
person Prashant    schedule 02.09.2015
comment
Спасибо за правки @Am_I_Helpful. В духе сделанного вами редактирования, You_are_helpful :) - person Prashant; 02.09.2015
comment
Спасибо за признание меня с You_are_helpful! Спасибо еще раз. И +1 - person Am_I_Helpful; 02.09.2015

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

Если вы хотите различать обработку ошибок для каждого из подклассов, вы можете использовать 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");
            }

        }
person bitemouth    schedule 15.11.2016
comment
Вы можете напрямую использовать несколько блоков catch для перехвата различных типов исключений в порядке от конкретного к общему вместо использования instanceof для каждого типа исключения. - person Raj Rajeshwar Singh Rathore; 26.11.2018

Exception является родительским классом для всех исключений, и в идеале (предпочтительный подход — передовая практика кодирования) вы никогда не должны перехватывать 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();
} 
person Sategroup    schedule 02.09.2015
comment
Спасибо @stategroup, я знаю, что Exception является суперклассом, но я не знаю других типов исключений во время выполнения, поэтому в моем коде есть NumberFormateexception (ожидаемый) и excetpion (неожиданный). - person M.S.Naidu; 02.09.2015
comment
@ M.S.Naidu, чтобы убедиться, что ваш код не вызовет никаких других исключений, вы можете проверить другие методы, которые вы вызываете. Если вы не выполняете никаких операций ввода-вывода, приведения классов и т. д. (которые могут вызвать исключение RunTime), вам не нужно перехватывать исключение. Причина, по которой Java имеет другой уровень исключений, заключается в том, что вы можете точно контролировать свой код. Таким образом, вы можете поймать исключение и проигнорировать его или повторно выдать. - person Sategroup; 02.09.2015