3-й семестр / Лекции / 6 — Исключения и их обработка в Java
class Main < public static void main(String[] args) < int a = 4; try < System.out.println(a/0); >catch (ArithmeticException e) < SystemПроизошла.outнедопустимая.println(" арифметическаяоперация"); >> > Теперь вместо стандартного сообщения об ошибке будет выполняться блок catch, параметром которого является объект e соответствующего исключению класса (самому объекту можно давать любое имя, оно потребуется в том случае, если мы пожелаем снова принудительно выбросить это исключение, например, для того, чтобы оно было проверено каким-то ещё обработчиком). В блок try при этом помещается тот фрагмент программы, где потенциально может возникнуть исключение. Одному try может соответствовать сразу несколько блоков catch с разными классами исключений. import java.util.Scanner; class Main < public static void main(String[] args) < int[] m = <-1,0,1>; Scanner sc = new Scanner(System.in); try < int a = sc.nextInt(); m[a] = 4/a; System.out.println(m[a]); >catch (ArithmeticException e) < System.out.println("Произошланедопустимая арифметическаяоперация"); >catch (ArrayIndexOutOfBoundsException e) < SystemОбращение.outпонедопустимому.println(" индекмас"); с ивау >> >-1,0,1>
Если запустив представленную программу, пользователь введётся с клавиатуры 1 или 2, то программа отработает без создания каких-либо исключений.
Если пользователь введёт 0, то возникнет исключение класса ArithmeticException, и оно будет обработано первым блоком catch. Если пользователь введёт 3, то возникнет исключение класса ArrayIndexOutOfBoundsException (выход за приделы массива), и оно будет обработано вторым блоком catch. Если пользователь введёт нецелое число, например, 3.14, то возникнет исключение класса InputMismatchException (несоответствие типа, вводимого значение), и оно будет выброшено в формате стандартной ошибки, поскольку его мы никак не обрабатывали. Можно, однако, добавить обработчик для класса Exception, поскольку этот класс родительский для всех остальных контролируемых исключений, то он будет перехватывать любые из них (в том числе, и InputMismatchException). import java.util.Scanner; class Main < public static void main(String[] args) < int[] m = <-1,0,1>; int a = 1; Scanner sc = new Scanner(System.in); try < a = sc.nextInt(); m[a-1] = 4/a; System.out.println(m[a]); >catch (ArithmeticException e) < SystemПроизошла.outнедопустимая.арифметическаяprintln(" операция"); >catch (ArrayIndexOutOfBoundsException e) < SystemОбращение.outпонедопустимому.println(" индекмас"); с ивау >catch (Exception e) < SystemПроизошло.outещёкакое.println(" -то исключение"); >> > Поскольку исключения построены на иерархии классов и подклассов, то сначала надо пытаться обработать более частные исключения и лишь затем более общие. То есть поставив первым (а не третьим) блок с обработкой исключения класса Exception, мы бы никогда не увидели никаких сообщений об ошибке, кроме «Произошло ещё какое-то исключение» (все исключения перехватились бы сразу этим блоком и не доходили бы до остальных).-1,0,1>
Необязательным добавлением к блокам try…catch может быть блок finally. Помещенные в него команды будут выполняться в любом случае, вне зависимости от того, произошло ли исключение или нет. При том, что при возникновении необработанного исключения оставшаяся после генерации этого исключения часть программы — не выполняется. Например, если исключение возникло в процессе каких-то длительных вычислений, в блоке finally можно показать или сохранить промежуточные результаты. Выражение throw Рассмотрим исключения, которые выбрасываются с использованием ключевого слова throw. Обычно выражение или блок throw выполняется внутри некоторого выражения или блока if<> , которое проверяет условие, которое отрабатывает код в том случае, если исключение все-таки было брошено. import java.util.Scanner; public class CreatingExceptions < //Создаобъ исключения т,твозможно,бросаетего. public static void main (String[] args) throws OutOfRangeException < final int MIN = 25, MAX = 40; Scanner scan = new Scanner (System.in); OutOfRangeException problem = new OutOfRangeException ("Input value is out of range."); System.out.print ("Enter an integer value between " + MIN + " and " + MAX + ", inclusive: "); int value = scan.nextInt(); import java.util.Scanner; public class CreatingExceptions< //Создаобъ исключения т,твозможно,бросаетего. public static void main (String[] args) throws OutOfRangeException < final int MIN = 25, MAX = 40; Scanner scan = new Scanner (System.in); OutOfRangeException problem = new OutOfRangeException ("Input value is out of range."); System.out.print ("Enter an integer value between " + MIN + " and " + MAX + ", inclusive: "); int value = scan.nextInt(); // Determine if the exception should be thrown if (value < MIN || value >MAX) throw problem;
System.out.println («End of main method.»); //этастрм о бытьжетчканикогданедостигнута > > //представляетсобойисключительноесос, тороеяние //обрабаты ваетслучай,когдазначениенаходитсявне //некоторого конкретного диапазона. public class OutOfRangeException extends Exception < //----------------------------------------------------- /Устанавливаобъеисключопр сообще тнияделен н ымием OutOfRangeException (String message) < super (message); >> I/O исключения Давайте рассмотрим вопросы, связанные с исключениями ввода/вывода. Поток представляет собой последовательность байтов, которые выходят из некоторого источника и направляются в приемник. В программе, мы читаем информацию из входного потока данных и записываем информацию в выходной поток. Программа может управлять несколькими потоками одновременно. Стандартные I/O Существуют три стандартных потока ввода/вывода: • Стандартный поток вывода –определен в System.out • Стандартный поток ввода – определен в System.in • Стандартный поток ошибок – определен в System.err Мы используем System.out когда, напрмер выполняем выражение println(). System.out и System.err обычно представляют как правило, представляют собой конкретное окно на экране монитора. System.in обычно представлят ввод клавиатуры, который мы многократно используем с объектами Scanner. Класс IOException
Класс Scanner.
Считывание чисел
с клавиатуры
В этой теме мы научимся считывать в программу числа, которые пользователь вводит с клавиатуры. Мы сможем попросить пользователя ввести любые данные, а потом правильно на них отреагировать. В будущем совершенно аналогично чтению с клавиатуры класс Scanner можно будет использовать, чтобы читать текст из файлов и из каналов интернет-связи.
Когда вы записали в переменную число, вы можете делать с ним всё что угодно. Это мог быть ответ человека на вопрос теста типа «Сколько будет 7*7?» Это мог быть ответ на вопрос типа «Выберите первое, второе или третье действие», и программа выполнит выбранное действие. Это могли быть входящие данные типа «Введите значение скорости поезда и длину пути, и программа ответит вам, когда он прибудет в такой-то город». Это бывает нужно постоянно – программы считывают данные от пользователей, и ввод данных с клавиатуры просто необходим.
В целом раздел 2 будет посвящен считыванию данных с клавиатуры и оператору if, с помощью которого можно будет указать «если верно условие, то делать то-то». Также мы пройдём, какие для этого оператора бывают логические условия, узнаем альтернативу оператору «если» — switch. На основе этих инструментов мы сделаем программу-тест и калькулятор.
Считывание чисел, слов, данных с клавиатуры или из файла часто называют сканированием, поэтому в Java за сканирование отвечает класс Scanner. Рассмотрим код:
// Сравните 2 строчки кода: // объявить x типа int и приравнять числу 10 int x = 10; // объявить myscan класса Scanner и приравнять новому Сканеру Scanner myscan = new Scanner (System.in); // Как видите, наш класс очень похож на тип int. // На самом деле, класс - это просто набор данных в одном названии.
Сравните эти две строчки кода. Первая строчка гласит:
int x = 10; // Объявить переменную типа int с именем x, равную начальному значению 10.
Вторая гласит:
Scanner myscan = new Scanner (System.in); /* Объявить объект класса Scanner с именем myscan, равный новому сканеру с параметром System.in */
Это очень похожие вещи. Сначала мы указываем имя класса Scanner, точно также как обычно мы указываем имя типа int. После этого идет новое имя – мы называем конкретное целое число именем x, и называем конкретный сканер именем myscan.
После знака равно идет начальное значение – для переменной это просто 10, а вот для сканера мы должны использовать new. Этот оператор означает «создать новый» или более точно «заказать память под новый объект». На самом деле, при объявлении переменной под неё тоже заказывается память, но здесь памяти требуется больше и поэтому мы заказываем память явно именем new. После new идет имя класса, под который нужно заказать память – мы хотим сканер и указываем Scanner. В скобках идут уточняющие параметры – какой именно сканер.
В данном случае указываем параметром System.in. Это поток ввода текста с клавиатуры. In – с английского ввод, out – с английского вывод. System.out – поток вывода текста на экран. System.in – поток ввода текста с клавиатуры. Слово поток просто значит, что он считывает не одну клавишу, а последовательность нажатых клавиш.
В общем случае это выглядит так:
Scanner имя = new Scanner (System.in);
Чтобы Java нашла класс Scanner, нужно его импортировать в проект или проще говоря включить. Это делается управляющей строчкой, поставьте её выше main в самом верху своего кода сразу после самой первой строчки package:
import java.util.Scanner; // в начале кода после package
Так мы включаем для себя класс Scanner. Так же мы всегда будем подключать и другие библиотеки, классы и вообще возможности.
Когда не знаете, что импортировать для того или иного класса, просто забейте в гугл «Java имя_класса import» и быстро найдете результат. Также все стандартные классы Java описаны в официальной документации, например, класс Scanner и все его функции описаны тут — https://docs.oracle.com/javase/10/docs/api/java/util/Scanner.html
Среда разработки также подсказывает, что нужно импортировать для того или иного класса — нажмите на покрасневшее имя нового класса правой кнопкой мыши, и выберите «импортировать класс». Так строчка импорта появится сама собой. В некоторых средах разработки конкретные кнопки отличаются, но суть та же.
Объявив переменную х, мы можем дальше ей пользоваться. Так и теперь, объявив объект myscan, мы можем его использовать, чтобы читать данные с клавиатуры. Например, «считать следующее целое» (по-английски «next int») будет так:
int x = myscan.nextInt (); // Расшифровка: // int x = число, считанное с клавиатуры; // объявить целое y, равное результату функции nextInt.
Здесь мы запускаем функцию nextInt () для объекта myscan. Точка между ними означает принадлежность nextInt к myscan. Круглые скобки как и всегда для функций означают «выполнить функцию с данным именем».
Функция nextInt класса Scanner считывает цифры, вводимые с клавиатуры и преобразует их в целое число. Она считывает их до ближайшего разделителя, т.е. пробела или enter. Она останавливает работу приложения до тех пор, пока человек не введет число на клавиатуре. То есть, например, если вы запустили myscan.nextInt () и ушли от компьютера, то он и через 10 лет будет ожидать, когда вы введете число и нажмете enter.
Аналогично nextDouble () возвращает дробное число, а функция next () возвращает одно слово как строку String. Со строками мы научимся работать в ближайших уроках.
int a = myscan.nextInt (); // сначала считать целое и сохранить в a double b = myscan.nextDouble (); // далее считать дробное в b int c = myscan.nextInt (); // наконец считать ещё целое в c
Inputmismatchexception java что это
Брошенный a Scanner указать, что полученный маркер не соответствует образец для ожидаемого типа, или что маркер испытывает недостаток диапазона для ожидаемого типа.
Сводка конструктора
Конструкции InputMismatchException с null как его строка сообщения об ошибке.
Конструкции InputMismatchException , сохранение ссылки на сообщение об ошибке представляет в виде строки s для более позднего извлечения методом getMessage.
Сводка метода
Методы java.lang унаследованный от класса. Throwable
Методы java.lang унаследованный от класса. Объект
Деталь конструктора
InputMismatchException
public InputMismatchException()
Конструкции InputMismatchException с null как его строка сообщения об ошибке.
InputMismatchException
Конструкции InputMismatchException , сохранение ссылки на сообщение об ошибке представляет в виде строки s для более позднего извлечения методом getMessage.
Платформа Java™
Стандарт Эд. 7
Представьте ошибку или функцию
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE . Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.
InputMismatchException почему бесконечный цикл при вводе?
Всем доброго времени! Изучаю исключения в Java. Написал небольшую тестовую программу. Смысл в том, что в цикле воспринимается ввод целого числа от пользователя и затем возвращается значение из массива, по введенному индексу. Возможны два исключения:
1. Пользователь ввел несуществующий индекс. Ловится исключение IndexOutOfBoundsException, выводится на экран и ввод воспринимается снова.
2. Пользователь ввел не целое число. Ловится исключение InputMismatchException, выводится на экран и. почему-то зацикливается. Почему так происходит? Пробовал перезаписывать переменную i валидным значением, все равно уходит в бесконечный цикл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
import java.util.*; public class FirstSample { public static void main(String[] args) { int[] a = {1,2,3,4,5,6,7,8,9}; Bad b = new Bad(a); Scanner cin = new Scanner(System.in); int i = -1; do { System.out.print("index: "); try { i = cin.nextInt(); System.out.println(b.get(i)); } catch (IndexOutOfBoundsException e) { System.out.println(e.getMessage() + ". Try new one or type -1 to exit."); } catch (InputMismatchException e) { System.out.println("You typed incorrect index value. Please type integer bteween " + Integer.MIN_VALUE + " and " + Integer.MAX_VALUE + "."); } } while (i != -1); System.out.println("Good bye!."); } } class Bad { private int[] arr; public Bad(int[] a) { arr = a; } public int get(int i) { if (i >= arr.length) { throw new IndexOutOfBoundsException("No such element: "+i); } return arr[i]; } }