JavaRush
AI Academy
new
Акция
Университет
Java FullStack
Python FullStack
AI Native Developer
new
Web FullStack
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/Помогите!!! что я делаю не так?
Никита Свиридов
30 уровень
  • 16.08.2023
  • 361просмотров
  • 13комментариев

Помогите!!! что я делаю не так?

Вопрос по задаче Разные методы для разных типов
Java Core,  5 уровень,  12 лекция
Обсуждается


В этой задаче тебе нужно:

  1. Считывать с консоли данные, пока не будет введено слово "exit".
  2. Для каждого значения, кроме "exit", вызвать метод print(). Если значение:
    • содержит точку '.', вызвать метод print() для Double;
    • больше нуля, но меньше 128, вызвать метод print() для short;
    • меньше либо равно нулю или больше либо равно 128, вызвать метод print() для Integer;
    • иначе — вызвать метод print() для String.

Требования:
  • Программа должна считывать данные с клавиатуры.
  • Программа должна прекращать считывать данные с клавиатуры после того, как введена строка "exit".
  • Если введенная строка содержит точку("."), и ее можно корректно преобразовать в число типа Double - должен быть вызван метод print(Double value).
  • Если введенная строка может быть корректно преобразована в число типа short и полученное число больше 0, но меньше 128 - должен быть вызван метод print(short value).
  • Если введенная строка может быть корректно преобразована в число типа Integer и полученное число меньше или равно 0 или больше или равно 128 - должен быть вызван метод print(Integer value).
  • Во всех остальных случаях должен быть вызван метод print(String value).
....
package com.javarush.task.task15.task1519; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /* Разные методы для разных типов */ public class Solution { public static void main(String[] args) throws IOException { //напиште тут ваш код BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while(true) { String string = reader.readLine(); if(string.equals("exit")) break; try { double d = Double.parseDouble(string); short s = Short.parseShort(string); int n = Integer.parseInt(string); if(string.contains(".")) { print(d); }else if(s > 0 && s < 128){ print(s); }else if(n <= 0 || n >= 128) { print(n); }else { print(string); } } catch(NumberFormatException e) { print(string); } }} public static void print(Double value) { System.out.println("Это тип Double, значение " + value); } public static void print(String value) { System.out.println("Это тип String, значение " + value); } public static void print(short value) { System.out.println("Это тип short, значение " + value); } public static void print(Integer value) { System.out.println("Это тип Integer, значение " + value); } }
0
Комментарии (13)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Никита Свиридов
Уровень 30
Expert
21 августа 2023, 05:53
Ребята все спасибо разобрался. Вы мне очень помогли.
0
German
Уровень 41
17 августа 2023, 07:58
В том же порядке в разные Try.
+1
Гофф
Уровень 3
Master
16 августа 2023, 23:31
Навскидку - ошибка в логике. Если число парсится в дабл, и при этом не парсится в шорт, то ты через кэтч вызываешь метод для стринг.
+1
Greek Hohlov
Уровень 1
16 августа 2023, 13:58
В первую очередь нужно проверить введенное значение на наличие ".", если есть, то пытаться спарсить в Double через try catch, если "." нет, то в try пробовать спарсить в int, если там число, то его уже проверять на > 0 и < 128, если попадает в этот диапазон, то каст в byte, если нет, print((byte) число), если не в диапазоне, то print(число)
+2
Дмитрий Быканов
Уровень 32
16 августа 2023, 11:55
да, не знаю важно ли это но там еще прикол что там не только NumberFormatException бывает, но и нул поинтер тоже. если будет null и ты пытаешь парсить кастуя к даблу
+1
hidden #3303140
Уровень 2
16 августа 2023, 13:08
Невозможно считать null из System.in. Это может произойти, только если подменить поток System.in другим потоком данных и достигнуть конца потока. Такое делается, если ты решаешь через приложение, там поток System.in подменяется потоком из блока input data, и этот поток конечный. Но ты должен гарантировать работу программы только на входных данных, которые последней строкой имеют строку "exit". Другими словами, если в input data последняя строка не exit, то возникнет NPE, но это нормально - пользователь (тот, кто вводит данные) должен последней строкой ввести exit. В продакшене такой код будет работать бесконечно, пока не встретится exit. Если же там последняя строка "exit", но у тебя случилось NPE, то тогда твоя ошибка в том, что ты не отловил вовремя строку "exit" и не прекратил выполнение программы.
+1
Дмитрий Быканов
Уровень 32
16 августа 2023, 14:11
я не про System.in.я про его Double.parseDouble(string);. если он вызовет его на не инициализированной string то там вроде выйдет npe
+1
hidden #3303140
Уровень 2
16 августа 2023, 15:02
Ага, а я объясняю, что readLine() может вернуть null, только если поток пустой. А System.in не может быть пустой. А твоя строка инициализируется при объявлении переменной. Кстати, неинициализированная переменная и переменная, инициализированная чем угодно (в т.ч. null) - это разные вещи. К неинициализированной переменной вообще нельзя обратиться, ей можно только присвоить значение.
0
Дмитрий Быканов
Уровень 32
16 августа 2023, 20:19
Спасибо. А разве, например, неинициализированная переменная String и String инициализированная null`ом - это не одно и тоже? только что проверил. вроде одинаково отрабатывает в одном кейсе. К ней можно обратиться. Хотя и IDE ругается в другом что мол "перем. может быть неиниц."
0
Стас ПасинковSoftware Developer в ZipyMaster
16 августа 2023, 23:01
ні, це різне. код з неініціалізованю змінною навіть не скомпілюється. код зі змінною, яку ви проініціювали null-ем - скомпілюється і буде працювати (допоки ви в цього null-a не спробуєте викликати який-небудь метод)
+1
hidden #3303140
Уровень 2
17 августа 2023, 06:30
Стас дело говорит. Надо только не забывать, что поля классов, и статические и нестатические, по умолчанию инициализируются значением null при создании, если им не присвоить значение. В этом примере только последняя переменная notInitialized не инициализирована:
public class Main {

	static Object nullField;

	public static void main(String[] args) {
		System.out.println(nullField == null);

		Object nullLocal = null;
		System.out.println(nullLocal == null);

		Object notInitialized;
		//System.out.println(notInitialized == null); // эта строка вызовет ошибку компиляции
	}
}
+1
Дмитрий Быканов
Уровень 32
17 августа 2023, 10:54
А я понял, спасибо хлопцы, а я делал вот такое типо как у тебя "static Object nullField;" и оно работало) а оно оказывается там инициализация под капотом сама происходит
0
hidden #3303140
Уровень 2
16 августа 2023, 06:54
Ты напрасно парсишь всё сразу. Если число десятичное (с точкой) или если оно больше диапазона short, то при парсинге неподходящего формата возникнет исключение, и ты провалишься в блок catch.
+2
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush