@ TofuBear заявляет:
Простой совет - не перехватывать исключения, которые компилятор не говорит вам перехватить, вместо этого, если выдается одно из них, выясните, какое изменение вам нужносделать так, чтобы исключение не происходило.
Я думаю, что это слишком упрощение.
Это правда, что исключения, которые объявлены как проверенные исключения, ДОЛЖНЫ быть либопойман или объявлен как выброшенный в сигнатуре метода.
Также верно, что вам не нужно перехватывать непроверенные исключения, и действительно, вы должны тщательно продумать, целесообразно ли перехватывать непроверенные.(Например, вам следует подумать, генерируется ли исключение в ожидаемой вами точке и по тем причинам, которые вы ожидаете.)
Однако в некоторых обстоятельствах явно необходимо их отловить.Например:
try {
System.out.println("Enter a lucky number!");
String input = // get string from user
int number = Integer.parseInt(input);
...
} catch (NumberFormatException ex) {
System.err.println("Bad luck! You entered an invalid number");
}
Если вы не поймали NumberFormatException
... что является исключением unchecked ... тогда вы не сможете распечататьсообщение и попросите пользователя повторить попытку.
Короче говоря, непроверенные исключения не всегда означают ошибку программиста.
Некоторые из стандартных могут указывать на неверный ввод от пользователя или клиента (например, NumberFormatException, IllegalArgumentException, ArithmeticException и т. Д.), Или они могут указывает на то, что конкретное приложение может восстановить или, по крайней мере, пытается диагностировать.
Я сталкивался со сторонними библиотеками, в которых разработчик испытывает отвращение к проверенным исключениям и объявляет все исключения библиотек непроверенными.(Плохой дизайн ИМО, но это случается ...)
Так что общее утверждение, что вы не должны ловить непроверенные исключения, является явно неправильным советом.
Однако вторая часть совета @ TofuBear действительна.(Вообще) лучше сделать тест, чтобы предотвратить возникновение ожидаемого исключения, чем выполнить действие и поймать исключение.(Код, как правило, проще и эффективнее ... хотя есть примеры счетчиков.)
В этом случае, если вы позвоните и протестируете hasNextDouble()
до nextDouble()
, вы можете избежать ошибки, которую выпытаемся справиться с помощью try / catch.