0

Подскажите, пожалуйста, где у меня тут ошибка? При вводе Y-y или N-n все равно не выходит из цикла! Кстати, тип переменной reply - char. Я пытаюсь ее преобразовать в String и ни чего не выходит! Цикл как будто с ума сошел!!!

public class ClassReply {
private char reply;
public ClassReply() {
    Scanner myScanner = new Scanner(System.in);
    while (true)
    {
        System.out.print("У вас есть купон? (y/n) ");
        try
        {
            reply = myScanner.next().charAt(reply);
            if (reply != 'Y' && reply != 'y' && reply != 'N' && reply != 'n')
                System.err.println("Не верный ответ...");
            else
                break;
        }
        catch (Exception e)
        {
            System.err.println("Это вообще не символ!"+e.getClass());
        }
    }
}
Nofate
  • 34,603
Andrey
  • 80
  • http://ru.stackoverflow.com/q/417405/10105 – VladD Apr 27 '15 at 15:11
  • myScanner.next().charAt(reply); что, простите? – VladD Apr 27 '15 at 15:12
  • 1
    У вас в условии связка проверок через && (AND) - условие будет выполнено , только когда ВСЕ проверки будут верными , что для одной переменной НЕВОЗМОЖНО. Используйте связку через || (OR) - условие будет выполнено , когда одна из проверок верная – pavlofff Apr 27 '15 at 15:16
  • myScanner.next().charAt(reply); - это вызов ввода данных пользователя что бы ввел да или нет, а reply это переменная типа char; возможно я не правильно пишу все... но что то у меня не получается, а на счет проверки мне обязательно нужно что бы все значения reply были true – Andrey Apr 27 '15 at 15:19
  • @Andrey: А вы всё же прочитайте вопрос по ссылке. И кроме того, какой должен быть аргумент у charAt? А что у вас? – VladD Apr 27 '15 at 15:22
  • 1
    @pavlofff Ну почему же невозможно. Тут условие что reply не равен ничему из списка "Y", "y", "N", "n". – tutankhamun Apr 27 '15 at 15:23
  • @tutankhamun ? а .. ну да , у нас же != , а не = – pavlofff Apr 27 '15 at 15:26
  • @VladD я прочитал там все про equal но мне это не очень подходит. мои сравнения работают отлично без всего лишнего. а вот я попытался сделать проверку для пользователя что бы он если ввел вместо буквы цифру ему ответила программа Это вообще не символ! и так далее... но у меня все застряло на условии и не хочет выходить из цикла((( – Andrey Apr 27 '15 at 15:27
  • Ну допустим. А что должно быть аргументом в .charAt? – VladD Apr 27 '15 at 15:29
  • в переменную char reply; должно присвоиться значение например введенное пользователем цифру 1 она тут же проверяется если не преобразуется в char то catch перехватывает это и говорит Это вообще не символ! а для букв идет проверка на правильный ввод Y-y N-n – Andrey Apr 27 '15 at 15:32
  • а если в .charAt() выставить 0, то не работает ваще catch! я вот и застрял на этом не пойму что делаю не так! – Andrey Apr 27 '15 at 15:36
  • @Andrey: Стойте-стойте. Ещё раз. Что должно быть аргументом в методе String.charAt? [подсказка]. – VladD Apr 27 '15 at 15:37
  • ребят, объясняю возможно я вот эту строку не верно пишу - reply = myScanner.next().charAt(reply); так как то что мне нужно не получается((( – Andrey Apr 27 '15 at 15:38
  • @Andrey: И сразу вдогонку: какой из методов, по-вашему, должен выбросить исключение? – VladD Apr 27 '15 at 15:38
  • @Andrey: Да, неверно. Вы хотите разобраться, почему, или чтобы вам просто написали правильно? – VladD Apr 27 '15 at 15:39
  • @VladD выбросить исключение должно само преобразование char, если пользователь вводит цифру ему должно выйти сообщение Это вообще не символ! вот как то так :) напишите если не сложно, а я попробую разобраться что не так делал – Andrey Apr 27 '15 at 15:41
  • @Andrey: Смотрите. Строка состоит из символов. В ней не может быть не-символ. Поэтому исключению взяться неоткуда. Кроме того, у вас нет преобразования типов, поэтому и исключению неоткуда взяться. CharAt гарантировано выдаёт char. – VladD Apr 27 '15 at 17:21
  • @VladD я уже ни чего не пойму. просидел целый день над этим кодом так ни чего и не получилось((( а всего то лишь надо что бы catch перехватывал ошибку если пользователь вводит цифру вместо буквы(((( – Andrey Apr 27 '15 at 17:54
  • @Andrey: А! О боже. Понял. Так вот: цифра — это ТОЖЕ СИМВОЛ! Так что исключения не будет. Проверяйте вручную. – VladD Apr 27 '15 at 17:55
  • [http://ru.stackoverflow.com/questions/419440/%D0%A1%D1%87%D0%B8%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D1%87%D0%B8%D1%81%D0%BB%D0%B0-%D1%81-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D0%B8-%D0%BA%D0%B0%D0%BA-%D1%81%D0%BF%D1%80%D0%B0%D1%88%D0%B8%D0%B2%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F-%D0%BF%D0%BE%D0%BA%D0%B0-%D0%BE%D0%BD-%D0%BD%D0%B5-%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D1%82-%D1%87%D1%82%D0%BE-%D0%BD] помните вы преобразовали вот этот пример? как мне сделать тоже самое только для символов Y-y N-n ????? – Andrey Apr 27 '15 at 18:01
  • @Andrey: Проблема в том, что цифра такой же char. Написал ответ, прочитайте внимательно и просмотрите ВСЕ используемые функции. – VladD Apr 27 '15 at 18:04

2 Answers2

0

Вам нужно вот что:

boolean reply;

// ...
while (true)
{
    System.out.print("У вас есть купон? (y/n) ");
    String inp = myScanner.next();
    if (inp.length() > 1)
    {
        System.err.println("Нужна одна буква");
        continue;
    }
    char c = inp.charAt(0);
    if (!Character.isLetter(c))
    {
        System.err.println("Это вообще не буква");
        continue;
    }
    char upC = Character.toUpperCase(c);
    if (upC != 'N' && upC != 'Y')
    {
        System.err.println("Надо Y или N");
        continue;
    }
    reply = (upC == 'Y');
    break;
}

Почитайте внимательно и убедитесь, что вы понимаете, что к чему в этом коде. Это важно.

VladD
  • 206,799
  • а что такое bool ??? этот boolean??? а то просто bool java не понимает – Andrey Apr 27 '15 at 18:08
  • Ага, ща поправлю. – VladD Apr 27 '15 at 18:09
  • а вот теперь в другом классе не идет расчет по скидке так как символьное значение пропало ((( ладно щас посмотрю что смогу сделать – Andrey Apr 27 '15 at 18:16
  • @Andrey: Так стало ж ещё лучше. Вместо непонятного символа у вас теперь правильный boolean — да или нет. Завтра вы добавите другой язык, и что, переписывать код в другом классе? – VladD Apr 27 '15 at 18:19
  • вот что пишет в другом классе - incomparable types: boolean and char а вот сам код - 'if (myReply.getReply() == 'Y' || myReply.getReply() == 'y'){ price -= 2.00; System.out.print("+(скидка) "); }' – Andrey Apr 27 '15 at 18:23
  • @Andrey: Ну думайте же! Я не могу всё разжевать за вас. Подумайте, что возвращает getReply() теперь. – VladD Apr 27 '15 at 18:24
  • я вот удивляюсь как вы так быстро пишите код :( – Andrey Apr 27 '15 at 18:25
  • Кстати, код 'if (myReply.getReply() == 'Y' || myReply.getReply() == 'y') был ужасен. Подумайте, что произойдёт, если пользователь введёт y. – VladD Apr 27 '15 at 18:25
  • Нуууу... Практика и ещё раз практика. – VladD Apr 27 '15 at 18:26
  • ну когда пользователь вводит y то считается скидка...я проверял до этого все работает хорошо. а что вы там заметили не то? – Andrey Apr 27 '15 at 18:27
  • @Andrey: Ну, если пользователь вводил y, у него спрашивалось 2 раза. – VladD Apr 27 '15 at 18:31
  • видимо с меня программист плохой :( – Andrey Apr 27 '15 at 18:32
  • @Andrey: Вы учитесь. С практикой такие вещи бросаются в глаза. – VladD Apr 27 '15 at 18:33
  • @ValdD а вы тоже так программировали раньше как я сейчас? как думаете у меня получится стать программистов вообще? кстати какой у вас стаж? просто это мой первый язык программирования и я только месяц учу((( точнее читаю книжки по программированию для чайников))) – Andrey Apr 27 '15 at 18:36
  • 13 лет + учёба. а начинал тоже так, как и вы. :-) – VladD Apr 27 '15 at 18:38
  • ни че себе 13 лет 0_о вот это да!!!! надеюсь я тоже буду таким же программистом как и вы! желание есть только вот мало что еще понимаю(( – Andrey Apr 27 '15 at 18:40
  • 1
    Удачи! И обязательно прочитайте книжку не для чайников. http://ru.stackoverflow.com/q/416634/10105 – VladD Apr 27 '15 at 18:41
  • то что вы в коде тут написали я все прекрасно понимаю для чего и зачем, но проблема в том я ни знаю откуда вы такие команды находите и как их искать тоже не понимаю вот и сижу пишу ерунду всякую в коде :( – Andrey Apr 27 '15 at 18:42
  • хорошо спасибо вам еще раз огромное!!! буду учиться учиться :) – Andrey Apr 27 '15 at 18:42
  • @Andrey: не страшно, придёт с опытом. // Пожалуйста! – VladD Apr 27 '15 at 18:43
-1
reply = myScanner.next().charAt(0);
Qwertiy
  • 123,725
  • нет так не пойдет, я же написал что если выставить значение 0 в .charAt () не будет выполнятся catch – Andrey Apr 27 '15 at 15:52
  • Во-первых, я этого не читал. Во-вторых, этот catch и не должен выполняться. С каких пор можно ввести что-то не являющееся символом? Ну проверь, что длина строки равна 1, если ты это хочешь. Но catch - бред. – Qwertiy Apr 27 '15 at 15:55
  • 'while (true) { System.out.print("Возраст? "); String line = myScanner.nextLine(); try
    { age = Integer.parseInt(line); if (age > 150) System.err.println("Больше 150 не бывает!"); else break; } catch (NumberFormatException e) { System.err.println("Это вообще не число"); } }' как видишь преобразование тут выполняется! если пользователь вводит букву вместо цифры ему в ответ приходит catch!!!! @VladD это применил и теперь я тоже самое хочу сделать но только с символами!
    – Andrey Apr 27 '15 at 15:56
  • Букву пользователь вместо цифры ввести может, а вот вместо символа что-то другое - нет. – Qwertiy Apr 27 '15 at 16:00
  • ну а что теперь делать тогда? – Andrey Apr 27 '15 at 16:01
  • С чем что делать? – Qwertiy Apr 27 '15 at 16:24