Новости из мира ПК
7 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд

Java util inputmismatchexception

Java Exception Handling – InputMismatchException

Moving along through our in-depth Java Exception Handling series, today we’ll be examining the InputMismatchException. The InputMismatchException is thrown when attempting to retrieve a token using the text Scanner class that doesn’t match the expected pattern or type.

In this article we’ll explore the InputMismatchException in more detail by first looking at where it sits in the larger Java Exception Hierarchy. We’ll also explore the basic purpose and usage of the built-in Scanner class, and see how improper use of this class can result in unintended InputMismatchExceptions in your own code, so let’s dig in!

The Technical Rundown

All Java errors implement the java.lang.Throwable interface, or are extended from another inherited class therein. The full exception hierarchy of this error is:

Full Code Sample

Below is the full code sample we’ll be using in this article. It can be copied and pasted if you’d like to play with the code yourself and see how everything works.

This code sample also uses the Logging utility class, the source of which can be found here on GitHub.

When Should You Use It?

To understand what might cause an InputMismatchException we need to briefly explore what the Scanner class is and how it might be used in a Java application. Scanner can be used to perform simple text scanning and parsing using regular expression or delimiter pattern matching. It can be used for single lines of text, or even massive files containing thousands of lines. For our sample code we’re using the 2014 GDP data courtesy of Plotly, which is in the common CSV file format. There are only a couple hundred lines of text in this file, but it should give us an interesting scenario in which to properly parse some real-world data.

To begin we start with the delimiterTestByDirectTypes method:

This method passes our local File into a new Scanner instance and specifies the use of a delimiter of «[,\n]» . This delimiter is necessary because our CSV file separates each value within a record using a comma, but it also contains multiple records separated by a newline ( n ), so we need to inform the Scanner instance that both of these delimiters should be accounted for.

Once our Scanner instance is created we check if it has a new line and next() value, which is the default type retrieved by a Scanner instance and assumes the token it will find next is a String . From there, we directly extract each subsequent token by calling or scanner.nextDouble() , depending what type of value we’re extracting. Both our country and code values should be Strings , while gdp is a float or Double . Once extracted, we output everything into a clean, padded format.

The result of executing this method is as follows:

So, everything was working just as expected until we reached the 15th record, at which point an InputMismatchException was thrown. If we look at the source data a bit we can see why we ran into a problem:

Here we see our data isn’t as “clean” as we originally thought. The “The Bahamas” is alphabetized by ignoring the word “The”, this record actually has three comma delimiters, rather than the expected three of all previous records. As a result, our first call to for this record returns «Bahamas , because it uses the first comma it finds as a delimiter. Thus, the next call to scanner.nextDouble() tries to evaluate the value of The» as a Double , which obviously fails, resulting in the InputMismatchException we see above.

One possible solution would be to perform some kind of sanity checks before we explicitly call the scanner.nextDouble() method. To assist with this and allow our code to be a bit more future-proof we’ve added the getScannerValueByType(Class clazz, Scanner scanner) helper method:

Читать еще:  Восстановить базу данных mysql из консоли dump

The purpose of this method is merely to invoke the appropriate[Type] method based on the type that was passed to it. Furthermore, we explicitly perform a sanity check using the appropriate scanner.hasNext[Type] method prior to actually returning a value, to ensure that no unexpected InputMismatchExceptions are thrown.

The delimiterTestByTypes() method is similar to our previous test, but we use the results of getScannerValueByType(. ) for each record:

Executing this code no longer throws any InputMismatchExceptions , but we still see some strange behavior:

Once again, everything works fine until we get to the “Bahamas, The” record. Just as before, since our delimiter pattern is merely [,\n] , the Scanner has a difficult time handling records with more than two comma-separators. In fact, the best solution is not to rely on the delimiter setting at all, but to instead use a more complex RegEx pattern to match (and then extract) each value from each record. To accomplish this we have one last method, resultStreamTest() :

Here we’re taking advantage of the new findAll(Pattern pattern) method added to the Scanner class in Java 9. This presents a much more modern programming pattern that allows us to chain functions, predicates, and other methods onto the iterable result of Stream . In this case, we’re collecting all results into a List , which we then iterate through in a for loop and extract each record’s value to be assigned to the relevant local variable and output.

The majority of the work here is accomplished in the REGEX_PATTERN passed to scanner.findAll(. ) :

You can see the regex pattern in action on, but the basic purpose is to ensure we’re capturing only three values from each line, and that we handle all unusual formatting and characters that are possible in the country name/first field, such as extra commas, quotation marks, parenthesis, and so forth.

The final result is an accurate and clean extraction and log output of all our GDP data:

The Airbrake-Java library provides real-time error monitoring and automatic exception reporting for all your Java-based projects. Tight integration with Airbrake’s state of the art web dashboard ensures that Airbrake-Java gives you round-the-clock status updates on your application’s health and error rates. Airbrake-Java easily integrates with all the latest Java frameworks and platforms like Spring , Maven , log4j , Struts , Kotlin , Grails , Groovy , and many more. Plus, Airbrake-Java allows you to easily customize exception parameters and gives you full, configurable filter capabilities so you only gather the errors that matter most.

Check out all the amazing features Airbrake-Java has to offer and see for yourself why so many of the world’s best engineering teams are using Airbrake to revolutionize their exception handling practices!

Java ошибка «исключение в потоке «main» java.util.InputMismatchException» в программе массива

Недавно я набрал эту программу java, чтобы принять десять областей и их pin-коды, а затем выполнить поиск, чтобы найти конкретную область и распечатать ее pin-код. Вот код из программы :

И после входа в две области я получаю это ERROR:

Кто-нибудь, пожалуйста, скажите мне, что я делаю не так! :/ Любая помощь будет оценена по достоинству.

6 Ответов

Прежде всего, не забудьте сделать отступ в коде для удобства чтения.

Концепция 1.

Концепция 2.

// сравнение строк с помощью метода compareTo (который возвращает 0 при равенстве

Rest из вашего кода и концепций являются правильными 🙂

InputMismatchException — если следующий токен не соответствует целочисленному регулярному выражению или находится вне диапазона

Итак, похоже, что ваш Scanner пытается читать в int , но получает что-то, что он не может превратить в int (либо то, что он читает, не является числом, либо число слишком велико).

Вы вызываете соответствующую функцию здесь:

Я предполагаю, что в какой-то момент ваш вызов .nextLine() поглощает целую строку, а следующая строка начинается с «area». Я не могу сделать больше, не зная, как вы ожидаете, что вход будет отформатирован.

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

Похоже, что вы ввели строку, тогда как nextInt() ожидает целое число.

Читать еще:  Java lang enum

Я предполагаю, что ошибка происходит в строке pincode[i]=s.nextInt(); (которая является строкой 14). Причина, по которой это происходит, заключается в том, что входные данные (от не могут быть проанализированы как int . Вы уверены, что вводите правильные значения?

Входные данные не могут быть проанализированы как целое число. Может быть, у вас есть запятая в конце строки.

это плохая практика для проверки равенства строк. использовать поиск.равняется(area[j])с null-проверка.

Я новичок в программировании. Однако я столкнулся с аналогичной проблемой, чтобы прийти при создании клиентов для банка (это просто проблема практики). Чтобы преодолеть эту проблему, я создал отдельные сканеры для каждого входного типа &, закрыв все сканеры в конце программы. Это сработало.

Похожие вопросы:

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

Я сделал калькулятор Java, но когда я ввожу число, которое действительно длинное, я получаю эту ошибку: Исключение в потоке main java.util.InputMismatchException: для входной строки.

Может кто-нибудь помочь с этим? Я могу заставить его работать, но после выходного сообщения What is the outside Temperature: Number here Тип (C) в градусах Цельсия или (F) в течение по Фаренгейту.

Я пытаюсь извлечь некоторые записи из файла txt и поместить их в базу данных в следующей программе Java package Java_Demo; import java.sql.*; import java.util.*; import*; public class.

я пытаюсь найти свои самые первые шаги в java и при разработке кода ниже import java.util.Scanner; public >
Исключение в потоке «main» java.util.InputMismatchException ошибка

Я считаю, что я написал весь мой код правильно, но я получаю эту ошибку, может кто-то помочь мне понять: Exception in thread main java.util.InputMismatchException at.

Я искал, но я действительно не могу найти ничего плохого в коде, пожалуйста, помогите! Код компилируется, но это ошибка, которую я получаю, когда хочу ответить на вопрос 3: Exception in thread main.

У меня есть вопрос о том, что происходит, всякий раз, когда я пытаюсь его скомпилировать, он продолжает давать мне такую ошибку: Exception in thread main java.util.InputMismatchException at.

У меня есть программа, над которой я работаю, которая преобразует двоичный код в десятичный. Код работает для небольших двоичных чисел, введенных пользователем, но когда я ввожу длинное двоичное.

Чтение ввода с консоли

Ключевой момент: чтение ввода с консоли даёт возможность программе принимать ввод от пользователя

В предыдущем параграфе значение radius было зафиксировано в исходном коде. Чтобы использовать другой радиус, нужно каждый раз менять исходный код и перекомпилировать программу. Очевидно, что это не удобно, поэтому вместо такого подхода, вы можете использовать класс Scanner для консольного ввода.

Java использует System.out для обращения к стандартному устройству вывода и для стандартного устройства ввода. По умолчанию, устройство вывода – это дисплей монитора, а устройство ввода – это клавиатура. Для выполнения консольного вывода, вы просто используете метод println для отображения в консоль простых значений или строк. Консольный ввод не поддерживается напрямую в Java, но вы можете использовать класс Scanner для создания объекта для чтения ввода из Это делается так:

Синтаксис new Scanner( создаёт объект типа Scanner. Синтаксис Scanner input объявляет, что input является переменной, чей тип – Scanner. Вся строка Scanner input = new Scanner( создаёт объект Scanner и присваивает его ссылку переменной input. Объект может вызывать свои методы. Вызвать метод объекта означает запросить объект выполнить задачу. Вы можете вызвать метод nextDouble() для чтения значения double следующим образом:

Инструкция считывает число с клавиатуры и присваивает это число переменной radius. Перепишем программу из предыдущего урока, чтобы она запрашивала радиус у пользователя:

Читать еще:  Восстановление базы данных sql без резервной копии

Обратите внимание, что десятичным разделителем, в зависимости от локали вашей системы, может быть точка или запятая. Если у вас возникает ошибка InputMismatchException, то посмотрите чуть ниже.

Строка 10 отображает в консоли надпись «Введите радиус: ». Это называется prompt (подсказка, напоминание), поскольку он направляет пользователя к вводу данных. Если ваша программа ожидает ввода с клавиатуры, она всегда должна говорить пользователю, ввод каких данных от него ожидается.

print или println

Метод print на десятой строке

идентичен методу println с той лишь разницей, что println переходит к началу новой строки после отображения строки, а print после вывода не переходит к следующей строке.

Строка 8 создаёт объект Scanner. Инструкция на одиннадцатой строке считывает ввод с клавиатуры.

После того, как пользователь ввёл число и нажал клавишу Ввод (Enter), программа считывает число и присваивает его переменной radius.

Больше подробностей об объектах будет представлено в одной из последующих главах. На текущий момент просто примите, что это то, как получить вход с консоли.

Конкретный импорт

Класс Scanner находится в пакете java.util. Он импортируется на строке 2. Имеется два вида инструкций import: конкретный импорт и импорт с подстановочными символами. Конкретный импорт импортирует определённый единичный класс в инструкции import. Например, следующая инструкция импортирует Scanner из пакета java.util.

Импорт с подстановочным символом

Импорт с подстановочным символом импортирует все классы из пакета, используя звёздочку в качестве подстановочного символа. Например, следующая инструкция импортирует все классы из пакета java.util.

Разница в производительности между импортом одного класса или всех классов в пакете

Информация для классов из импортируемого пакета не считывается во время компиляции или во время выполнения если класс в программе не используется. Инструкция import просто говорит компьютеру, где расположен класс. Нет разницы в производительности между конкретным импортом или импортом с подстановочным символом.

Ещё одна программа, которая даёт пример чтения нескольких значений с клавиатуры. Программа считывает три числа и показывает их среднее арифметическое:

Листинг с номерами строк:

Код для импорта класса Scanner (строка 2) и создание объекта Scanner (строка 8) такие же, как и в предшествующем примере, как и во всех новых программах, которые вы будете писать, для чтения ввода с клавиатуры.

Строка 10 делает запрос пользователю ввести три числа. Числа считываются на строках 11-13. Вы можете ввести три числа разделив их пробелами, а затем нажать кнопку Enter, или нажимать клавишу Enter после каждого числа. Оба варианта показаны в примерах запуска этой программы.

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

Примечание: большинство программа в начальных главах этого сайта выполняют три шага – ввод, обработка и вывод, это также называется IPO (от английских input, process, and output). Ввод – это получение данных от пользователя; обработка – это выработка результата, используя ввод, а вывод – это отображение результатов.

Решение проблемы с ошибкой InputMismatchException

Если при попытке ввести число с плавающей точкой, например, такой строкой программы:

Вы получаете ошибку:

Это означает, что локаль* вашей системы в качестве десятичного разделителя ожидает не точку, а запятую (или наоборот).

*Региональный стандарт, региональные настройки (проф. жарг. лока́ль от англ. locale, /lɔ.kal/ или /ləuˈkɑ:l/) — набор параметров, определяющий региональные настройки пользовательского интерфейса, такие как язык, страна, часовой пояс, набор символов и т. п.

Выходов из этой ситуации два:

  • использовать десятичный разделитель вашей локали (точку вместо запятой или запятую вместо точки)
  • чуть изменить программу – явно указать локаль

Для этого при создании объекта Scanner добавьте .useLocale(Locale.US). Например, объект создавался следующим образом:

После дополнения получается такая строка создания объекта:

Также в начале программы требуется сделать дополнительный импорт:

К примеру, код программы из этого параграфа, чтобы она начала принимать числа, у которых десятичным разделителем является точка, становится таким:

Рейтинг статьи
Ссылка на основную публикацию