import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Reader;
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int years = reader.read();
String name = reader.readLine();
reader.close();
System.out.println(name + " захватит мир через " + years + " лет. Му-ха-ха!");
}
}
Консоль:
8
захватит мир через 56 лет. Му-ха-ха!
Т.е. консоль не дает ввести имя, а сразу выводит результат.
Понимаю, что проблема в коде int years = reader.read(); и решается через String years = reader.readLine();
Но почему, именно так это работает? Если можно подскажите, пожалуйста, что почитать для понимания.
rsborodin
10 уровень
Почему именно так?
Решен
Комментарии (10)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
1 мая 2020, 10:52
read не считывает число с консоли, пользуйся readLine.
read считывает один байт
0
rsborodin
1 мая 2020, 10:57
int years = reader.readLine();
тоже не решение.
работает либо:
String years = reader.readLine();
либо
String years = reader.readLine();
int nYears = Integer.parseInt(years);
0
rsborodin
1 мая 2020, 10:57
Но почему так?
0
hidden #598481
1 мая 2020, 10:58
Ну разумеется.
readLine() возвращает строку (String), и такой объект можно положить только в переменную соответствующего типа. Если тебе нужно преобразовать строку в число, нужно воспользоваться Integer.parseInt(), в результате получишь целое число.
0
rsborodin
1 мая 2020, 10:59
Через Reader нельзя считывать сразу в int?
0
hidden #598481
1 мая 2020, 11:01
Тебе необязательно сохранять переменную со строкой, можешь сразу передавать прочитанную строку в parseInt:
+1
hidden #598481
1 мая 2020, 11:04решение
Сразу считать числа не получится.
Из консоли при помощи InputStreamReader считывается поток байт. Если использовать BufferedReader, можно эти байты буферизовать и считывать уже строки, формируемые этими байтами. Для получения из этих строк целых чисел, вещественных чисел, дат или других токенов требуются дальнейшие преобразования, как Integer.parseInt(), Double.parseDouble(); DateFormat.parse() и прочие.
Есть инструменты типа класса Scanner, которые умеют сразу распознавать и считывать конкретные токены, но у них есть свои особенности в работе, и их надо разбирать отдельно.
+2
rsborodin
1 мая 2020, 11:06
vk, спасибо! Стало понятно теперь!
0
PetrPrav
1 мая 2020, 18:45
А где можно узнать , что такое Integer.parseInt вообще?
0
hidden #598481
1 мая 2020, 19:46
В лекциях об этом упоминается.
Как и о любом методе можно узнать в Javadoc: https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)
Конкретно этот метод просто преобразует содержимое строки в число, которое в этой строке написано.
0