Scanner.nextInt: примеры (JAVA)
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 с кастомным разделителем и проверкой
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)
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
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) Чтение большого потока чисел: сравнение производительности
// Подход с Scanner удобен, но медленнее на больших объёмах.
// Для больших файлов предпочтительнее BufferedReader + парсинг строк.
Комментарий: При миллионах чисел Scanner может работать заметно медленнее и потреблять больше памяти, чем потоковый разбор через BufferedReader.
5) Чтение из InputStream с явным указанием кодировки
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) Обработка смешанного ввода (число затем строка), корректное продвижение по разделителям
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 бит и внимание к производительности при больших объёмах данных.