Преобразование строк Java в значения других типов. Преобразование типов в Java
Часто задаваемый вопрос по типам String/int в Java : Как преобразовать тип String в тип Int ?
Решение : используя метод parseInt класса Java Integer . Метод parseInt переводит тип String в Int , и вызывает исключение NumberFormatException , если строка не может быть приведена к целочисленному значению.
Посмотрим на два коротких примера.
1. Простой пример преобразования “ string to integer” в Java
Игнорируя исключение, которое может возникнуть, всё, что нужно сделать для перевода String в int , умещается в одну строку кода:
int i = Integer.parseInt(myString);
Если строка, представленная переменной myString , является корректным целым числом, например, “1”, “200”, и т.п., она будет приведена к типу int . Если преобразование окончится неудачей, будет вызвано исключение NumberFormatException . Поэтому ваш код должен быть немного длиннее, чтобы учитывать это, как показано в следующем примере.
2. Полный пример перевода String в int
Ниже приведен полный код примера программы. Она демонстрирует процесс перевода в Java строки в целое число и обработку возможного исключения NumberFormatException :
public class JavaStringToIntExample{ public static void main (String args) { // String s = "fred"; // Используйте эту строку для теста исключения String s = "100"; try { // перевод String в int выполняется здесь int i = Integer.parseInt(s.trim()); // выводим значение после преобразования System.out.println("int i = " + i); } catch (NumberFormatException nfe) { System.out.println("NumberFormatException: " + nfe.getMessage()); } }}
Пояснение
В приведенном выше примере метод Integer.parseInt(s.trim()) используется для перевода строки s в целое число i в следующей строке кода:
int i = Integer.parseInt(s.trim());
Если попытка преобразования оканчивается неудачей (например, если вы пытаетесь привести строку fred к целому типу ), то метод parseInt класса Integer вызовет исключение NumberFormatException , которое необходимо обработать в блоке try/catch .
В этом примере на самом деле не нужно использовать метод trim() класса String . Но в реальных программах он понадобится, поэтому я применил его здесь.
Дополнительные замечания
Раз уж мы обсуждаем эту тему, вот несколько замечаний о классах String и Integer :
- Метод Integer.toString(int i) используется для преобразования из типа int в класс Java String .
- Для преобразования объекта String в объект Integer используйте метод valueOf() класса Integer вместо parseInt() .
- Если нужно приводить строки к другим примитивным типам Java , например, long , используйте методы Long.parseLong() , и т.п.
Резюме
Надеюсь, что этот пример перевода String в int в Java был полезным. Если у вас есть вопросы или замечания, оставляйте их в комментариях.
Перевод статьи “How to convert a Java String to an Int ” был подготовлен дружной командой проекта .
Хорошо Плохо
Класс Integer является контейнером для типа данных int. Этот класс включает в себя методы преобразования значений из строки в объект Integer. Данное руководство содержит…
Приблизительный уровень необходимых знаний: квест Java Syntax и немного Java Core.
В конце первого квеста JavaRush мы изучаем преобразование типов. В лекциях 10 уровня вы могли видеть, что преобразовать int в String - очень просто, и вообще практически любой примитивный тип приводится к String без проблем. int x = 5 ; String text = "X=" + x; Также те, кто уже доучился до 10 уровня квеста Java Syntax, знают, что невозможно привести ссылку на число к ссылке на строку. Так как же лучше всего конвертировать строку в примитивное целое число? Делать это лучше с помощью метода parseInt класса Integer . Метод parseInt должен преобразовать String в int и выдает исключение NumberFormatException , если строка не может быть преобразована в тип int .
Пример
Основная строка, которая переводит строку в целое число: int i = Integer. parseInt (myString) ; Если строка, обозначенная переменной myString , является допустимым целым числом, например «1», «200», Java спокойно преобразует её в примитивный тип данных int . Если по какой-либо причине это не удается, подобное действие может вызвать исключение NumberFormatException , поэтому чтобы программа работала корректно для любой строки, нам нужно немного больше кода. Программа, которая демонстрирует метод преобразования Java String в int , управление для возможного NumberFormatException: public class JavaStringToIntExample { public static void main (String args) { // String s = "fred"; // используйте это, если вам нужно протестировать //исключение ниже String s = "100" ; try { // именно здесь String преобразуется в int int i = Integer. parseInt (s. trim () ) ; // выведем на экран значение после конвертации System. out. println ("int i = " + i) ; } catch (NumberFormatException nfe) { System. out. println ("NumberFormatException: " + nfe. getMessage () ) ; } }Обсуждение
Когда вы изучите пример выше, вы увидите, что метод Integer.parseInt (s.trim ()) используется для превращения строки s в целое число i , и происходит это в следующей строке кода: int i = Integer. parseInt (s. trim () ) Но иногда перевести строку в число просто так не получится. В нашем примере такая строка - имя fred. Можно говорить о кодах, в которых буквы записываются в компьютере, но, формально говоря, fred никакое не число, и лучше его оставить строкой. Наша программа организована так, что при попытке преобразования «фреда» в число процесс Integer parseInt вызовет исключение NumberFormatException , которое вы должны обрабатывать в блоке try / catch . В этом случае вам не обязательно использовать метод trim () класса String , но в реальном программировании вы должны его использовать. Так что мы его вам продемонстрировали. Раз уж поднялась такая тема, вот вам несколько «хинтов» по теме о классах String и Integer:- Integer.toString (int i) используется для преобразования int в строки Java.
- Если вы хотите преобразовать объект String в объект Integer (а не примитивный класс int), используйте метод valueOf () для класса Integer вместо метода parseInt () .
- Если вам нужно преобразовать строки в дополнительные примитивные поля Java, используйте такие методы, как Long.parseLong () и ему подобные.
Данная статья:
- написана командой . Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего
Преобразование типов - это тема, которая может показаться сложной начинающим программировать на Java. Однако, заверим Вас, на самом деле всё просто. Главное понять по каким законам происходит взаимодействие между переменными и помнить об этом при написании программ . Итак, давайте разбираться.
В Java существует 2 типа преобразований - картинка Вам в помощь:
Напомним, что вся "Вселенная Java" состоит из:
- примитивных типов (byte, short, int, long, char, float, double, boolean)
- объектов
В данной статье мы:
- рассмотрим преобразование типов для примитивных типов переменных
- преобразование объектов (String, Scanner и др.) в этой статье не рассматривается, поскольку с объектами происходит отдельная «магия» - это тема для отдельной статьи.
Автоматическое преобразование
Ну, что ж, давайте попробуем разобраться что такое "автоматическое преобразование".
Помните, когда мы рассматривали типы переменных (в статье ), мы говорили, что переменная - это некоторый «контейнер» , в котором может храниться значение для дальнейшего использования в программе. Также мы говорили о том, что каждый тип переменной имеет свой диапазон допустимых значений и объем занимаемой памяти. Вот она табличка, где это все было расписано:
Так вот, к чему мы, собственно говоря, клоним. К тому, что совсем не просто так Вам давались диапазоны допустимых значений и объем занимаемой памяти 🙂
Давайте, сравним, например:
1. byte и short. byte имеет меньший диапазон допустимых значений, чем short. То есть byte это как бы коробочка поменьше, а short - это коробочка побольше. И значит, мы можем byte вложить в short.
2. byte и int . byte имеет меньший диапазон допустимых значений, чем int. То есть byte это как бы коробочка поменьше, а int - это коробочка побольше. И значит, мы можем byte вложить в int.
3. int и long. int имеет меньший диапазон допустимых значений, чем long. То есть int это как бы коробочка поменьше, а long - это коробочка побольше. И значит, мы можем int вложить в long.
Это и есть пример автоматического преобразования. Это можно схематически изобразить в виде вот такой картинки:
Давайте рассмотрим как это работает на практике.
Пример №1
Код №1 - если Вы запустите это код на своем компьютере,
class Test { public static void main(String args) { byte a = 15; byte b = a; System.out.println(b); } }
class Test { byte a = 15 ; byte b = a ; |
Код №2 - если Вы запустите это код на своем компьютере, в консоли будет выведено число 15
class Test { public static void main(String args) { byte a = 15; int b = a; System.out.println(b); } }
class Test { public static void main (String args ) { byte a = 15 ; int b = a ; System . out . println (b ) ; |
И-и-и? Вы думаете, что раз в консоль было выведено одно и то же число, и код №1 отличается от кода №2 всего лишь типом переменной b, то между ними нет никакой разницы? Э то не так.
В коде №2 присутствует автоматическое преобразование типов , а в коде №1 - нет:
Хотя число, в принципе, одно и то же, но теперь оно находится в бо льшем контейнере, который занимает больше места на диске. При этом, JVM выполняет автоматические преобразования за Вас. Она знает, что int больше чем byte .
Приведение типов
Другое дело если вы пытаетесь переложить что-то из большего контейнера в более маленький.
Вы можете знать, что в большем контейнере лежит то, что поместиться и в маленьком – но об этом не знает JVM, и пытается предохранить вас от ошибок.
Поэтому, вы должны «прямо сказать», что ситуация под контролем:
class Test { public static void main(String args) { int a=0; long b=15; a = (int) b; } }
class Test { public static void main (String args ) { int a = 0 ; long b = 15 ; a = (int ) b ; |
Тут мы дописали (int) перед b . Если бы переменная a была, к примеру, типа byte , в скобках бы стояло (byte) . Общая формула выглядит так:
Она говорит "сделай из (большего) значения b переменную нужного мне (целевого) типа int ".
Если что-то пошло не так.
До этого мы рассматривали ситуации, предполагая, что мы точно знаем, что делаем. Но что если попытаться поместить в контейнер то, что туда не помещается?
Оказывается, в контейнере останется лишь то, что туда «влезло». К примеру, у чисел с плавающей точкой будет «отсекаться» дробная часть:
//пример 1 class Test { public static void main(String args) { double a=11.2345; int b=(int)a; System.out.println(b); // в консоли получится число 11 } }
//пример 1 class Test { public static void main (String args ) { double a = 11.2345 ; int b = (int ) a ; System . out . println (b ) ; // в консоли получится число 11 |
Надо помнить, что дробная часть не округляется , а отбрасывается .
А что будет, если мы попытаемся поместить число, которое выходит за допустимые границы? Например, если в byte (диапазон byte от -128 до 127) положить число 128? Думаете, мы получим 1? Нет. Мы получим -128:
class Test { public static void main(String args) { double a=128; byte b=(byte)a; System.out.println(b); //в консоли увидим -128 } }
Значение переменной при таком преобразовании можно рассчитать, но цель программиста – не допускать ситуации, когда значение выходит за допустимые границы, поскольку это может привести к неправильной работе программы.
Задания:
- Последовательно пропишите в компиляторе преобразования всех примитивных типов друг к другу, включая типы char и Составьте таблицу такого вида:
byte | short | char | int | long | float | double | boolean | |
byte | ||||||||
short | ||||||||
char | ||||||||
int | ||||||||
Long | ||||||||
Float | ||||||||
double | ||||||||
boolean |
На пересечении напишите: а – если преобразование происходит автоматически, на – если нужно использовать явное преобразование, х – если преобразование невозможно.
* приведение типа к самому себе называется тождественным – его прописывать не обязательно
- Посмотрите еще раз, какой размер имеет каждый примитивный тип. Попытайтесь составить блок-схему, показывающую, куда помещаются какие типы. Проведите стрелочки с надписью «расширяющее преобразование» и «сужающее преобразование».
Вопросы
На собеседовании на должность Junior Java Developer Вас могут спросить:
Что Вы знаете о преобразовании примитивных типов данных, есть ли потеря данных, можно ли преобразовать логический тип?
Попробуйте ответить на вопрос.
Подытожим:
- Если Вы "кладёте" в больший контейнер содержимое меньшего контейнера», преобразование происходит автоматически, и ошибок возникать не должно.
- Если есть необходимость положить «значение из большего контейнера в меньший», нужно быть осторожным, и пользоваться явным приведением типов.
- При приведении float или double к целочисленным типам, дробная часть не округляется, а просто отбрасывается.
- Тип boolean не приводится ни к одному из типов.
- Тип char приводится к числовым типам, как код символа в системе UNICODE.
- Если число больше своего контейнера, результат будет непредсказуемым.
В этой статье описана только часть материала на тему приведения типов. Существуют также приведения объектных типов, приведение к строке (ведь в строке может быть записано все что угодно, правда?) и автоматическое продвижение типов в выражениях.
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на .