Avatar ·

Как преобразовать строку (String) в целое число (int) в Java?

Всем привет! Я только начал изучать Java и столкнулся с проблемой. У меня есть строка, которая содержит число, например "123". Мне нужно выполнить с этим числом арифметические операции, но я получаю ошибку компиляции. Вот мой код: ```java String numberStr = "123"; int result = numberStr + 10; // Ошибка: cannot convert String to int ``` Я понимаю, что строка и число — это разные типы данных. Но как мне превратить строку "123" в целое число 123, чтобы потом с ним работать? Я пробовал писать `int number = (int) numberStr;`, но это тоже не работает, компилятор ругается на приведение типов. Видел, что кто-то использует `Integer.parseInt()`, но не совсем понимаю, как это работает и что делать, если в строке окажется не число, а, например, "abc". Будет ли программа падать с ошибкой? И есть ли другие способы, кроме `parseInt`? Заранее спасибо за помощь! Очень хочу разобраться с этой базовой операцией, так как она постоянно встречается в задачах. <<>>

Основной способ: Integer.parseInt()

Самый распространённый и надёжный способ преобразовать строку в целое число — использовать статический метод Integer.parseInt(String s). Он принимает строку и возвращает примитивный тип int. Вот как это работает в вашем примере:

String numberStr = "123";
int number = Integer.parseInt(numberStr);
int result = number + 10; // Теперь result = 133
System.out.println(result); // Выведет: 133

Метод разбирает строку символ за символом, собирая из них число. Если строка содержит корректное целое число (например, "456", "-789", "0"), преобразование пройдёт успешно.

Что делать с некорректными строками?

Если строка не может быть преобразована в число (например, "abc", "12.5" или пустая строка ""), parseInt() выбрасывает исключение NumberFormatException. Чтобы программа не падала, нужно обработать эту ситуацию:

String userInput = "abc";
try {
    int value = Integer.parseInt(userInput);
    System.out.println("Число: " + value);
} catch (NumberFormatException e) {
    System.out.println("Ошибка: строка не является целым числом!");
    // Здесь можно запросить новый ввод или задать значение по умолчанию
}

Альтернатива: Integer.valueOf()

Есть ещё метод Integer.valueOf(String s). Он делает почти то же самое, но возвращает объект Integer, а не примитивный int. Благодаря автоупаковке (autoboxing) разница почти незаметна:

String str = "42";
Integer obj = Integer.valueOf(str); // Возвращает Integer
int primitive = obj; // Автоупаковка в int

Разница в производительности минимальна, но valueOf() может кэшировать объекты для чисел от -128 до 127, что экономит память. Для большинства задач оба варианта взаимозаменяемы.

Дополнительные нюансы

  • Пробелы: Методы не терпят лишних пробелов. Строка " 123 " вызовет ошибку. Используйте str.trim() перед преобразованием.
  • Система счисления: parseInt() может принимать второй аргумент — основание системы счисления. Например, Integer.parseInt("FF", 16) вернёт 255.
  • Диапазон: Число должно помещаться в диапазон int (от -2^31 до 2^31-1). Для больших чисел используйте Long.parseLong().

Проверка перед преобразованием

Иногда полезно проверить строку заранее, чтобы избежать исключения. Например, можно использовать регулярное выражение:

String str = "123";
if (str.matches("-?\\d+")) { // Проверяет, что строка состоит только из цифр (и опционального минуса)
    int number = Integer.parseInt(str);
} else {
    System.out.println("Некорректный формат числа");
}

Но помните: даже такая проверка не гарантирует успех (например, строка из 20 цифр пройдёт проверку, но вызовет NumberFormatException из-за переполнения). Самый надёжный способ — всегда использовать try-catch.

<<>>

Использование Scanner для безопасного ввода

Если вы получаете строку от пользователя (например, из консоли или текстового поля), можно воспользоваться классом Scanner. Он умеет проверять, является ли следующий токен числом, и преобразовывать его:

import java.util.Scanner;

Scanner scanner = new Scanner(System.in);
System.out.print("Введите число: ");

if (scanner.hasNextInt()) {
    int number = scanner.nextInt();
    System.out.println("Вы ввели: " + number);
} else {
    System.out.println("Это не целое число!");
    String wrongInput = scanner.next(); // Очищаем некорректный ввод
}

Этот подход удобен, когда вы работаете с потоком ввода. hasNextInt() проверяет, можно ли преобразовать следующий токен, и только потом выполняет преобразование. Если проверка не пройдена, программа не падает, а сообщает об ошибке.

Когда использовать?

  • Для ввода с клавиатуры — Scanner с проверкой.
  • Для строк из файлов или сети — Integer.parseInt() с обработкой исключений.
  • Если нужно часто преобразовывать и важна производительность — parseInt() быстрее, чем Scanner.

Оба подхода решают вашу задачу, просто выбирайте подходящий по контексту.