W3docs

Как преобразовать String в int в Java

Преобразуйте строку Java в int с помощью Integer.parseInt и Integer.valueOf, а также обрабатывайте NumberFormatException.

Превратить текст вроде "42" в число 42 — одна из самых распространённых задач в Java: она возникает каждый раз, когда вы читаете аргументы командной строки, разбираете значение конфигурации или обрабатываете пользовательский ввод. JDK предоставляет пару однострочных инструментов для этого в классе Integer, а также понятный сценарий ошибки, если текст не является допустимым числом. В этой главе показаны идиоматические подходы и способы обработки некорректных случаев.

Integer.parseInt — примитивный int, который обычно нужен

Integer.parseInt(String) — основной инструмент. Он читает текст и возвращает примитивный int:

int count = Integer.parseInt("42");   // 42
int neg   = Integer.parseInt("-7");   // -7

Ведущий + или - допускается, но ничего больше: пробелы вокруг, десятичные точки, подчёркивания или буквы — всё это приводит к ошибке. Если возможны пробелы, предварительно обрежьте их с помощью s.trim() (или s.strip() в Java 11+). Существует также перегрузка, принимающая основание системы счисления: Integer.parseInt("ff", 16) читает шестнадцатеричное число и возвращает 255.

Integer.valueOf — когда нужен объект Integer

Integer.valueOf(String) выполняет то же разбирание, но возвращает Integer (обёрнутый тип), а не примитивный int. Используйте его, когда значение сразу помещается в коллекцию вроде List<Integer> или в любое место, где требуется ссылка на объект. В качестве бонуса valueOf кэширует обёрнутые экземпляры для небольших значений (от −128 до 127), поэтому он может быть незначительно дешевле, чем parseInt с последующим автоупаковкой.

ПодходВозвращаетИспользуйте когда
Integer.parseInt(s)примитивный intнужно сразу выполнить арифметику
Integer.valueOf(s)объект Integerнужна обёртка для коллекции или дженериков
Integer.parseInt(s, radix)примитивный intтекст записан в основании 2, 8, 16 и т.д.

Обработка некорректного ввода с помощью NumberFormatException

Оба метода бросают непроверяемое исключение NumberFormatException, когда строка не является допустимым целым числом — "12x", "3.14", "" или null — все они завершаются ошибкой. Поскольку исключение непроверяемое, компилятор не заставит вас его перехватывать, поэтому вы сами должны защитить входные данные, которые не контролируете:

String raw = userInput();
try {
  int value = Integer.parseInt(raw.trim());
  // ... use value
} catch (NumberFormatException e) {
  System.out.println("Not a whole number: " + raw);
}

Когда разбор «иногда ожидаемо завершается неудачей» и вы не хотите исключений в потоке управления, оберните его в вспомогательный метод, возвращающий OptionalInt вместо бросания исключения. Это превращает try/catch в чистую проверку isPresent() на стороне вызова. Смотрите Java Optional для изучения широкого паттерна, и Java try-catch для понимания механики перехвата исключений.

Практический пример: все подходы рядом

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

java— editable, runs on the server

Что следует вынести из выполнения:

  • Integer.parseInt("42") печатает 42 как примитивный int, а Integer.valueOf("42") печатает то же 42 — разница в типе: объект против примитива, а не в значении.
  • Перегрузка с основанием превращает "ff" в 255, доказывая, что второй аргумент управляет системой счисления; без основания по умолчанию используется 10.
  • "12x" отклоняется с NumberFormatException, сообщение которого — For input string: "12x" — исключение называет именно тот текст, который не удалось разобрать, что делает его полезным в логах.
  • Передача null бросает NumberFormatException (сообщение Cannot parse null string), а не NullPointerException — поэтому один перехват NumberFormatException покрывает как некорректный, так и null-ввод.
  • Вспомогательный метод tryParse обрезает " 7 " до 7 и возвращает absent для "nope", никогда не бросая исключений — это паттерн, который следует использовать, когда некорректный ввод является нормой, а не исключением.

Практика

Практика
Что происходит при вызове Integer.parseInt('3.14') в Java?
Что происходит при вызове Integer.parseInt('3.14') в Java?

Связанные темы

Was this page helpful?