Не работает код из книги Шилдта

Упражнение из главы о классах и методах. Сделал всё один в один (или нет?). Сначала дам код, а ниже напишу, что происходит

public class Help {
    void HelpOn(int what) {
        switch (what) {
            case '1':
                System.out.println("Оператор if\n");
                System.out.println("if(условие) оператор;");
                System.out.println("else оператор;");
                break;
            case '2':
                System.out.println("Оператор switch\n");
                System.out.println("switch (выражение){");
                System.out.println("case константа: ");
                System.out.println("последовательность операторов");
                System.out.println("break;");
                break;
            case '3':
                System.out.println("Оператор for\n");
                System.out.println("for (инициализация; условие; итерация)");
                System.out.println("оператор;");
                break;
            case '4':
                System.out.println("Оператор while\n");
                System.out.println("while (условие) оператор;");
                break;
            case '5':
                System.out.println("Оператор do-while\n");
                System.out.println("do { оператор } while (условие)");
                break;
            case '6':
                System.out.println("Оператор break\n");
                System.out.println("break; или break меткаж");
                break;
            case '7':
                System.out.println("Оператор continue\n");
                System.out.println("continue; или continue меткаж");
                break;
        }
        System.out.println();
    }
    void showmenu() {
        System.out.println("Справка: ");
        System.out.println("1. if ");
        System.out.println("2. switch");
        System.out.println("3. for");
        System.out.println("4. while");
        System.out.println("5. do while");
        System.out.println("6. break");
        System.out.println("7. continue");
        System.out.println("ВЫберите (q - выход): ");
    }
    boolean isvalid(int ch) {
        if (ch < '1' | ch > '7' & ch != 'q') return false;
        else return true;
        }
        }
class HelpClassDemo {
            public static void main(String args[])
                    throws java.io.IOException {
                char choice, ignore;
                Help hlpobj = new Help();
                for ( ; ; ) {
                    do {
                        hlpobj.showmenu();
                        choice = (char) System.in.read();
                        do {
                            ignore = (char) System.in.read();
                        } while (ignore != '\n');
                    } while (hlpobj.isvalid(choice));
                        if (choice == 'q') break;
                        System.out.println("\n");
                        hlpobj.HelpOn(choice);
                }
            }
        }

Короче при введении цифры не выполняется почему-то метод показа справки HelpOn(). После ввода цифры просто появляется еще раз справка с повторной просьбой ввести цифру. Есть чувство, что что-то не так с boolean методом, но не пойму, что. Проверял раз 5 на соответствие с тем, что в книге, но в книге после этого кода просто идёт водичка без примера работы, ссылаясь на то, что оно работает так же, как и в старом примере без методов.

UPD Попробовал поменять тип переменной what в методе HelpOn на char

void HelpOn(char what)

Не помогло

UPD Есть понимание, что, что бы я не вводил, он всё равно выводит справку (вводимый char вообще не воспринимается программой)


Ответы (1 шт):

Автор решения: Chezare Glissando

Нашёл ошибку. В последнем while в условии пропущен "!" перед условием, что означает что относящийся к нему do будет выполняться, пока этот while true.

→ Ссылка