Не в состоянии эффективно использовать 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();
}