if(numberOfOperation == 1) {
System.out.println("Введите значения: ");
Scanner scan = new Scanner(System.in);
if (scan.hasNextInt()) {
int a = scan.nextInt();
int b = scan.nextInt();
System.out.println(calculator.Add(a, b));
} else if (scan.hasNextDouble()) {
double a = scan.nextDouble();
double b = scan.nextDouble();
System.out.println(calculator.Add(a, b));
} else if (scan.hasNextLong()) {
long a = scan.nextLong();
long b = scan.nextLong();
System.out.println(calculator.Add(a, b));
} else {
System.out.println(" Ошибка ввода");
}
scan.close();
}
Пишу простейший калькулятор. В классе Calculator есть четыре метода( сложение, вычитание, умножение и деление), все они перегружены на три примитивных типа(integer, double, long).
В другом классе запускается метод main, создается объект класса Calculator, а с помощью BufferedReader считывается целочисленное значение от 1 до 4, которое является кодом операции. В примере прикрепил код для сложения.
Суть проблемы. Исходный код класса main вообще не отрабатывает ввод чисел, сразу завершается. Если тестить каждую операцию по отдельности, то виден такой момент, нормально работает для int и double, а вот для long не пашет.
Я знаю как работает Scanner в общих чертах( на вход подаются токены, которые по умолчанию разбиваться пробелами на отдельные части, которые потом можно проверить с помощью hasNext(type)() и спарсить в нужный тип), но как явно указать, что я подаю на вход long, если автоматом в Java целочисленные значения идут в int ? (Пробовал указать суффикс L на конце, но один фиг не работает)
Diy Makers
25 уровень
Помогите разобраться c классом Scanner
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Justinian Judge в Mega City One Master
8 июня 2020, 22:21
Такое юнит-тестами тестить надо.
Пробовал через консоль подавать число, которое явно больше диапазона инт?
Я никогда не задумывался про экзотические способы работы с консолью, первое что в голову пришло.
По самому коду, ты просто так пишешь калькулятор или с какой-то целью?
0
Diy Makers
9 июня 2020, 06:43
Да, пробовал подавать числа больше, но они улетают в double. {
Введите значения:
560000000000
690000000000
1.25E12
Process finished with exit code 0
}
Осталось задание с курсов, которые проходил пол года назад. Там надо было просто перегруженные методы написать, ну а я решил еще меню с выбором операции прикрутить и встрял. Я понимаю что можно нагуглить уже готовые варианты калькулятора и адаптировать их, но раз столкнулся с такой траблой то хочется разобраться.
0
Justinian Judge в Mega City One Master
9 июня 2020, 10:08
Ты создал очень синтетическую ситуацию, которую в реальной жизни поди придумай и найди.
Ввод через Scanner, именно лонги..
Почему не буфферед ридер? Это же правильный флоу будет, хотя вполне можно и Сканером - только стринги нужно читать, и там уже отдельную логику прописать. Анализируется строка на предмет что она такое. На джава раше задачка такая была, помнишь?: Разные методы для разных типов.
Реализуется на раз два просто и доступно.
+3
Diy Makers
9 июня 2020, 18:25
Вообще на тот момент я думал что все будет просто, поэтому и решил использовать Scanner, так как на нем логику быстрее писать, так то ридер конечно правильней, но в нем и строк больше и оборачивать его по хорошему в try/catch надо. Но я согласен с твоей логикой. Перепишу с ридером)
Написал и подумал, что иногда вместо того что-бы биться головой об стену, посмотреть на проблему с другой стороны. Спасибо за помощь)
0