Scanner.nextInt(): примеры (JAVA)
Scanner.nextInt(): intОписание метода
Метод Scanner.nextInt() в Java получает следующий токен входного потока, пытается интерпретировать его как целое число типа int и возвращает значение. В классе java.util.Scanner доступно две перегрузки:
int nextInt()- разбирает число в десятичной системе по умолчанию.int nextInt(int radix)- разбирает число в системе счисления с основаниемradix(например, 2, 8, 10, 16).
Возвращаемое значение: примитив int. При успешном чтении позиция сканера смещается за прочитанный токен.
Типичные исключения и условия:
InputMismatchException- следующий токен не соответствует шаблону целого числа в заданной системе счисления или число выходит за пределы диапазонаInteger.MIN_VALUE..Integer.MAX_VALUE.NoSuchElementException- токенов больше нет (конец потока) при попытке чтения.IllegalStateException- сканер закрыт.
Особенности поведения:
- Разбор происходит по токенам, определяемым делимитером (по умолчанию пробельные символы). Изменение делимитера влияет на границы токенов.
- Метод учитывает знак «-» и «+» перед цифрами. Поддержка разделителей групп (например, подчёркиваний) для входных данных отсутствует - такие символы приведут к
InputMismatchException. - При использовании перегрузки с
radixдопустимые символы - цифры и буквы, соответствующие указанному основанию, регистр букв значения не имеет.
Взаимосвязанные методы: hasNextInt() и hasNextInt(int radix) для безопасной проверки наличия следующего целого без генерации исключения.
Примеры использования
Ниже приведены простые примеры с кодом и выводом.
Чтение из строки (десятичное)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner("123 45 -7");
System.out.println(sc.nextInt());
System.out.println(sc.nextInt());
System.out.println(sc.nextInt());
sc.close();
}
}
123 45 -7
Чтение с указанием основания (шестнадцатеричное)
import java.util.Scanner;
public class HexDemo {
public static void main(String[] args) {
Scanner sc = new Scanner("1A ff 10");
System.out.println(sc.nextInt(16));
System.out.println(sc.nextInt(16));
System.out.println(sc.nextInt(16));
sc.close();
}
}
26 255 16
Проверка наличия следующего целого
import java.util.Scanner;
public class SafeRead {
public static void main(String[] args) {
Scanner sc = new Scanner("12 xyz 34");
if (sc.hasNextInt()) System.out.println(sc.nextInt());
if (sc.hasNextInt()) System.out.println(sc.nextInt());
sc.close();
}
}
12
Похожие методы внутри Java
Внутри платформы доступны методы и подходы, служащие альтернативой в разных ситуациях:
hasNextInt()- безопасная проверка перед чтением, предпочтительна в интерактивных или потоковых сценариях.nextLong(), nextShort(), nextByte()- чтение других целочисленных типов при необходимости других диапазонов.next()+Integer.parseInt()- явный разбор строки, полезен при необходимости обработки формата или логирования перед разбором.BufferedReader+Integer.parseInt- потенциально более производительный путь для построчного ввода большого объёма данных.BigIntegerчерезnew BigInteger(token)- при работе с числами за пределами диапазонаintилиlong.
Выбор зависит от требований к диапазону, производительности и обработке ошибок: для простого парсинга токенов удобнее Scanner.nextInt(), для высокой производительности чтения больших файлов предпочтение у BufferedReader с ручным разбором.
Аналоги в других языках
Краткая сводка эквивалентов в популярных языках и их отличия от Java:
- JavaScript:
parseInt(str, radix). ВозвращаетNaNпри ошибке, требует явной проверкиisNaN. Пример:console.log(parseInt("0x1A", 16));26
- Python:
int(s)илиint(s, base). ГенерируетValueErrorпри ошибке. Пример:print(int("123"))123
- PHP:
intval($s)или приведение типа. При неявном формате возможна потеря данных, требуется валидация. Пример:echo intval("42");42
- C#:
int.Parse(s)иint.TryParse(s, out n).TryParseвозвращает булево и не бросает исключение - чаще предпочтительно для безопасности. Пример:int v; bool ok = int.TryParse("123", out v); Console.WriteLine(v);123
- Go:
strconv.Atoi(s)иstrconv.ParseInt(s, base, bitSize). Возвращает значение и ошибку. Пример:v, err := strconv.Atoi("42") fmt.Println(v, err)42 <nil>
- Kotlin:
readLine()!!.toInt()илиtoIntOrNull(). Схожесть с Java, но синтаксическая лаконичность. Пример:println("123".toInt())123
- Lua:
tonumber(s). Возвращает число илиnil. Пример:print(tonumber("10"))10
- SQL: функции
CAST/CONVERTдля преобразования строк в числовые типы; поведение зависит от СУБД и может приводить к ошибке или NULL при некорректных данных.
Отличия от Java: в Java Scanner.nextInt() ориентирован на разбор потоковых токенов и бросает исключения при ошибке; в ряде языков распространены функции, возвращающие специальные значения (например, NaN или null) или предоставляющие безопасные варианты (например, TryParse в C#).
Типичные ошибки и их признаки
Частые ошибки при использовании Scanner.nextInt() с примерами и результатами.
1. InputMismatchException при некорректном токене
import java.util.Scanner;
public class Err1 {
public static void main(String[] args) {
Scanner sc = new Scanner("abc");
System.out.println(sc.nextInt());
}
}
Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) ... (stack trace)
2. NoSuchElementException при конце потока
import java.util.Scanner;
public class Err2 {
public static void main(String[] args) {
Scanner sc = new Scanner("");
System.out.println(sc.nextInt());
}
}
Exception in thread "main" java.util.NoSuchElementException at java.base/java.util.Scanner.throwFor(Scanner.java:939) ... (stack trace)
3. IllegalStateException при закрытом сканере
import java.util.Scanner;
public class Err3 {
public static void main(String[] args) {
Scanner sc = new Scanner("1");
sc.close();
System.out.println(sc.nextInt());
}
}
Exception in thread "main" java.lang.IllegalStateException at java.base/java.util.Scanner.ensureOpen(Scanner.java:1150) ... (stack trace)
Рекомендации по обработке ошибок
Для избежания исключений чаще применяются hasNextInt() или чтение токена через next() с последующей валидацией через Integer.parseInt() в блоке try/catch.
Изменения в поведении метода
Метод Scanner.nextInt() введён в Java 5 вместе с классом Scanner. За последние релизы платформы значимых изменений в семантике nextInt не происходило. Ключевые замечания:
- Поведение стабильно и сохраняет совместимость назад.
- Улучшения производительности и внутренние правки могли появляться в реализациях JDK, но интерфейс и список исключений остались прежними.
- Для работы с очень большими числами рекомендуется использовать
BigIntegerвместо попыток читать черезnextInt.
Продвинутые и редкие сценарии
Несколько продвинутых вариантов применения с пояснениями.
1. Разбор смешанного текста с помощью делимитера и radix
import java.util.Scanner;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
public class Mix {
public static void main(String[] args) {
String data = "val=0x1A;count=27;flag=1";
Scanner sc = new Scanner(new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)));
sc.useDelimiter("[=;]"); // разделители '=' и ';'
while (sc.hasNext()) {
String key = sc.next();
if (sc.hasNext()) {
String token = sc.next();
if (token.startsWith("0x") || token.startsWith("0X")) {
// убрать префикс и читать в 16-й системе
System.out.println(Integer.parseInt(token.substring(2), 16));
} else {
// попробовать считать как десятичное
if (token.matches("-?\\d+")) System.out.println(Integer.parseInt(token));
else System.out.println("non-int:" + token);
}
}
}
sc.close();
}
}
26 27 1
Комментарий: комбинация useDelimiter и ручной логики даёт гибкий разбор форматов, которые не укладываются в стандартный токен целиком.
2. Чтение больших потоков: сравнение со BufferedReader
// Для больших файлов: BufferedReader + parseInt обычно быстрее и требует меньше объектов
import java.io.*;
public class FastRead {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new StringReader("1 2 3 4 5"));
String line = br.readLine();
for (String tok : line.split(" ")) {
System.out.println(Integer.parseInt(tok));
}
br.close();
}
}
1 2 3 4 5
Комментарий: Scanner удобен, но при высоких требованиях к производительности рекомендуется парсить вручную.
3. Обработка переполнения и альтернативы
import java.util.Scanner;
public class Overflow {
public static void main(String[] args) {
Scanner sc = new Scanner("2147483648"); // Integer.MAX_VALUE + 1
try {
System.out.println(sc.nextInt());
} catch (Exception e) {
System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());
}
sc.close();
}
}
InputMismatchException: null
Комментарий: при необходимости работы с числами больше диапазона int лучше сперва получить токен через next() и использовать new java.math.BigInteger(token).
4. Чтение с локалью (влияние на дробные разделители)
import java.util.Locale;
import java.util.Scanner;
public class LocaleDemo {
public static void main(String[] args) {
Scanner sc = new Scanner("1234");
sc.useLocale(Locale.GERMANY); // для целых это не влияет, но важно для nextDouble
System.out.println(sc.nextInt());
sc.close();
}
}
1234
Комментарий: локаль сильнее влияет на методы для чисел с плавающей точкой; для целых локаль обычно не меняет допустимые символы.
5. Комбинация hasNextInt с тайм-аутом внешней логики
Встроенного тайм-аута у Scanner нет; при необходимости можно запускать чтение в отдельном потоке и контролировать время снаружи, что полезно при работе с сетевыми потоками или пользовательским вводом.