Scanner.nextInt(): примеры (JAVA)

Разбор метода nextInt у Scanner
Раздел: Парсинг
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

Пример java
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

Пример java
// Для больших файлов: 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. Обработка переполнения и альтернативы

Пример java
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. Чтение с локалью (влияние на дробные разделители)

Пример java
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 нет; при необходимости можно запускать чтение в отдельном потоке и контролировать время снаружи, что полезно при работе с сетевыми потоками или пользовательским вводом.

джава Scanner.nextInt() function comments

En
Scanner.nextInt() Считывает следующее целое число