Как преобразовать 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 для понимания механики перехвата исключений.
Практический пример: все подходы рядом
Эта программа выполняет каждую технику преобразования и два сценария ошибки, чтобы вы могли увидеть, что именно каждый из них возвращает или печатает:
Что следует вынести из выполнения:
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", никогда не бросая исключений — это паттерн, который следует использовать, когда некорректный ввод является нормой, а не исключением.
Практика
Связанные темы
- Как преобразовать int в String в Java — обратное направление.
- Java Exceptions — основы
NumberFormatExceptionи семейства непроверяемых исключений. - Java Data Types — разница между примитивом
intи обёрткойInteger.