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

Метод nextInt класса Scanner - обзор и образцы
Раздел: Сканирование ввода (Scanner)
Scanner.nextInt: int

Общее описание метода Scanner.nextInt

Метод Scanner.nextInt из пакета java.util читает следующий токен входного потока и пытается преобразовать его в значение типа int. Обычно применяется при обработке числового ввода из консоли, файлов или любых потоков, обёрнутых в Scanner.

Сигнатуры метода:

  • int nextInt() - считывает следующий токен десятичного целого.
  • int nextInt(int radix) - считывает следующий токен и интерпретирует его в системе счисления с основанием radix (например, 16 для шестнадцатеричной).

Поведение и особенности:

  • Метод пропускает разделители (по умолчанию пробелы, табуляция, перевод строки). Разделители можно изменить через useDelimiter.
  • Если следующий токен не соответствует ожидаемому целому, выбрасывается InputMismatchException.
  • Если поток закончился до чтения токена, выбрасывается NoSuchElementException.
  • Если объект Scanner закрыт, выбрасывается IllegalStateException.
  • Возвращаемое значение - примитив int. При выходе за границы int (слишком большое число для 32 бит) будет InputMismatchException или поведение, эквивалентное некорректному синтаксису числа.
  • Метод уважает указанное основание при вызове с параметром radix. По умолчанию основание 10, но можно использовать и другие значения в диапазоне [2, 36].

Дополнительные связки методов в классе Scanner полезные вместе с nextInt:

  • hasNextInt() и hasNextInt(int radix) - проверяют, можно ли безопасно вызвать nextInt без исключения.
  • nextLine(), next() - для чтения текстовых токенов; важно учитывать взаимодействие этих методов с позиционированием курсора в потоке.

Короткие примеры использования nextInt

Примеры демонстрируют распространённые сценарии: простое чтение, чтение с проверкой, чтение в другой системе счисления, обработка ошибок.

1) Базовое чтение из консоли

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Введите число: ");
        int n = sc.nextInt();
        System.out.println("Считано: " + n);
        sc.close();
    }
}
Ввод:
42
Результат:
Считано: 42

2) Проверка с hasNextInt

Scanner sc = new Scanner("abc 100");
if (sc.hasNextInt()) {
    System.out.println(sc.nextInt());
} else {
    System.out.println("Нет целого в начале строки");
}
sc.close();
Результат:
Нет целого в начале строки

3) Чтение числа в шестнадцатеричной системе

Scanner sc = new Scanner("7B");
int x = sc.nextInt(16); // 0x7B = 123
System.out.println(x);
sc.close();
Результат:
123

4) Чтение нескольких чисел с пользовательским разделителем

Scanner sc = new Scanner("1,2,3,4");
sc.useDelimiter(",");
while (sc.hasNextInt()) {
    System.out.println(sc.nextInt());
}
sc.close();
Результат:
1
2
3
4

Похожие методы в Java и их отличия

  • next() - возвращает следующий токен как строку. Полезно, когда требуется предварительная обработка или кастомная конвертация в число.
  • nextLine() - читает всю оставшуюся часть строки. Удобно при необходимости обработать остаток строки после чисел, но может взаимодействовать с nextInt неожиданно, так как nextInt не потребляет перевод строки.
  • hasNextInt() - безопасная проверка перед вызовом nextInt, предотвращающая InputMismatchException.
  • Integer.parseInt(String) - статический метод для преобразования строки в int; полезен при чтении через BufferedReader или когда нужна кастомная логика разбора.

Выбор предпочтительного подхода зависит от требований: для простого токенизированного ввода удобен Scanner.nextInt, для высокопроизводительного чтения больших объёмов лучше использовать BufferedReader и Integer.parseInt.

Аналоги в других языках и ключевые отличия

Ниже приведены эквиваленты чтения целых значений в популярных языках с кратким примером и результатом.

PHP

$line = trim(fgets(STDIN));
$num = intval($line);
echo $num . PHP_EOL;
Ввод:
42
Результат:
42

JavaScript (Node.js)

const fs = require('fs');
const input = fs.readFileSync(0,'utf8').trim();
const n = parseInt(input, 10);
console.log(n);
Ввод:
42
Результат:
42

Python

n = int(input())
print(n)
Ввод:
42
Результат:
42

SQL (пример в PostgreSQL)

SELECT CAST('42' AS INTEGER) AS n;
Результат:
 n
----
 42

C#

using System;
class Program {
  static void Main() {
    var s = Console.ReadLine();
    int x = int.Parse(s);
    Console.WriteLine(x);
  }
}
Ввод:
42
Результат:
42

Lua

local s = io.read()
local n = tonumber(s)
print(n)
Ввод:
42
Результат:
42

Go

package main
import (
  "fmt"
)
func main() {
  var n int
  fmt.Scan(&n)
  fmt.Println(n)
}
Ввод:
42
Результат:
42

Kotlin

fun main() {
  val n = readLine()!!.toInt()
  println(n)
}
Ввод:
42
Результат:
42

Ключевые отличия от Java Scanner.nextInt:

  • Во многих языках ввод сначала получается как строка, затем явно конвертируется. Это даёт полный контроль над обработкой ошибок и форматированием.
  • Scanner объединяет токенизацию и парсинг, что удобно, но медленнее для больших объёмов данных по сравнению с низкоуровневым чтением и последующим парсингом.
  • В Go и C# часто используются функции, которые возвращают успех/ошибку при парсинге (TryParse), что упрощает обработку некорректного ввода.

Типичные ошибки и примеры

Ниже перечислены распространённые ошибки при использовании nextInt с примером кода и результатом.

1) InputMismatchException при вводе некорректного токена

Scanner sc = new Scanner("abc");
int x = sc.nextInt();
System.out.println(x);
sc.close();
Результат:
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:...) ...

Комментарий: проверка через hasNextInt() устраняет исключение.

2) NoSuchElementException при отсутствии токена

Scanner sc = new Scanner("");
int x = sc.nextInt();
sc.close();
Результат:
Exception in thread "main" java.util.NoSuchElementException
    at java.base/java.util.Scanner.throwFor(Scanner.java:...) ...

3) Непредвиденное поведение при смешении nextInt и nextLine

Scanner sc = new Scanner("42\nHello\n");
int n = sc.nextInt();
String s = sc.nextLine();
System.out.println("n='" + n + "', s='" + s + "'");
sc.close();
Результат:
n='42', s=''
(вторая строка с текстом остаётся пока не прочитана методом nextLine)

Комментарий: nextInt оставляет разделитель конца строки, поэтому следующий nextLine вернёт пустую строку. Решения: вызвать дополнительный nextLine() после nextInt() или читать строки полностью и парсить их через Integer.parseInt.

4) Ошибки при использовании неверного radix

Scanner sc = new Scanner("9");
int x = sc.nextInt(8); // пытается распознать '9' в восьмеричной системе
System.out.println(x);
sc.close();
Результат:
Exception in thread "main" java.util.InputMismatchException
    at java.base/java.util.Scanner.throwFor(Scanner.java:...) ...

Комментарий: при использовании nextInt(radix) проверять допустимость символов и значение radix.

Изменения и заметные детали в разных версиях Java

Класс Scanner и метод nextInt появились в Java 5. В последующих версиях сигнатуры оставались стабильными, явных изменений в поведении nextInt не происходило. Основные нюансы:

  • Общие улучшения производительности и исправления ошибок происходили в разных релизах JDK, но API остался совместимым.
  • В модулях Java 9 класс находится в стандартном модуле java.base, это влияет на требования модульной сборки, но не на использование метода.

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

Расширенные и редкие сценарии использования

Несколько продвинутых вариантов работы, включая обработку CSV, чтение в произвольных системах счисления, работа с большими объёмами и fallback для больших чисел.

1) Разбор CSV с кастомным разделителем и проверкой

Пример java
import java.util.Scanner;

public class CsvInts {
    public static void main(String[] args) {
        Scanner sc = new Scanner("10,20,abc,40");
        sc.useDelimiter(",");
        while (sc.hasNext()) {
            if (sc.hasNextInt()) {
                System.out.println(sc.nextInt());
            } else {
                System.out.println("Пропущено: " + sc.next());
            }
        }
        sc.close();
    }
}
Результат:
10
20
Пропущено: abc
40

2) Автоопределение основания по префиксу (0x, 0b, 0)

Пример java
Scanner sc = new Scanner("0xFF 075 0b101 123");
while (sc.hasNext()) {
    String tok = sc.next();
    int val;
    if (tok.startsWith("0x") || tok.startsWith("0X")) val = Integer.parseInt(tok.substring(2), 16);
    else if (tok.startsWith("0b") || tok.startsWith("0B")) val = Integer.parseInt(tok.substring(2), 2);
    else if (tok.startsWith("0") && tok.length() > 1) val = Integer.parseInt(tok.substring(1), 8);
    else val = Integer.parseInt(tok, 10);
    System.out.println(val);
}
sc.close();
Результат:
255
61
5
123

3) Обработка очень больших чисел через next() и BigInteger

Пример java
import java.math.BigInteger;
import java.util.Scanner;

Scanner sc = new Scanner("123456789012345678901234567890");
String tok = sc.next();
BigInteger big = new BigInteger(tok);
System.out.println(big.multiply(BigInteger.TEN));
sc.close();
Результат:
1234567890123456789012345678900

4) Чтение большого потока чисел: сравнение производительности

Пример java
// Подход с Scanner удобен, но медленнее на больших объёмах.
// Для больших файлов предпочтительнее BufferedReader + парсинг строк.
Комментарий:
При миллионах чисел Scanner может работать заметно медленнее и потреблять больше памяти, чем потоковый разбор через BufferedReader.

5) Чтение из InputStream с явным указанием кодировки

Пример java
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

Scanner sc = new Scanner(System.in, StandardCharsets.UTF_8);
if (sc.hasNextInt()) System.out.println(sc.nextInt());
sc.close();
Ввод:
42
Результат:
42

6) Обработка смешанного ввода (число затем строка), корректное продвижение по разделителям

Пример java
Scanner sc = new Scanner("100\nText line\n");
int n = sc.nextInt();
sc.nextLine(); // очистить остаток строки после nextInt
String s = sc.nextLine();
System.out.println(n);
System.out.println(s);
sc.close();
Результат:
100
Text line

Пояснения: примеры демонстрируют практические приёмы - безопасная проверка токена, использование next() при необходимости парсинга в нестандартный формат, применение BigInteger при выходе за пределы 32 бит и внимание к производительности при больших объёмах данных.

джава Scanner.nextInt function comments

En
Scanner.nextInt Scans the next token of the input as an int