Проверка вводимого знака через консоль

151
19 января 2019, 13:50

Пытаюсь писать свою малюсенькую программу и одна из основ - это написание метода, в котором пользователь делает выбор в меню с помощью вводы цифры в консоль, но столкнулся с проблемой, второй день не могу понять, как реализовать код который будет проверять, введено ли число и если введено не число, то через system.out.println чтобы сообщал пользователю о том, что введено не число и давал возможность повторного ввода. Я написал код ниже, понимаю заранее что он не совсем правильный т.к. бесконечно будет выводит первый цикл While, прощу помощи т.к. я очень слаб в джаве.

import java.io.*;
import java.util.Scanner;

public class test {

    public static void main(String[] args) {
        System.out.println("\nДобро пожаловать\nЧто вас интересует? \n1 - Увидеть текущий список\n2 - Редактировать текущий список");
        Scanner scan1 = new Scanner(System.in);
        if (!scan1.hasNextInt()) {
            while (!scan1.hasNextInt()) {
                System.out.println("Вводит необходиу только цифры, попробуйте снова.\n");
            }
        }
        Scanner scan4 = new Scanner(System.in);
        int select1 = scan1.nextInt();
        if (select1 != 1 || select1 != 2) {
            while (select1 != 1 || select1 != 2){
                System.out.println("\nВы ввели неверное число, попробуйте снова.");
                select1 = scan4.nextInt();
                if (select1 == 1) {
                }
                if (select1 == 2) {
                }
            }
        } else if (select1 == 1) {
            System.out.println("Выбран 1 вариант");
        } else if (select1 == 2) {
            System.out.println("Выбран 1 вариант");
        }
    }
}
Answer 1

ТС, мыслил в правильном направлении) но можно сделать и проще, чем ответчики выше. Вот мой сохраненный кусок на ввод числа большего либо равного нулю.

  int number;
    do {
        System.out.println("Please enter a positive number!");
        while (!sc.hasNextInt()) {
            System.out.println("That not a number!");
            sc.next(); 
        }
        number = sc.nextInt();
    } while (number <= 0);
    System.out.println("Thank you! Got " + number);
Answer 2

Вот так вы сможете проверять, что на самом деле вводили.

import java.util.Scanner;
public class TestNumbers {
    public static boolean isInteger(String s) {
        if(s.isEmpty()) return false;
        for(int i = 0; i < s.length(); i++) {
            if(i == 0 && s.charAt(i) == '-') {
                if(s.length() == 1) return false;
                else continue;
            }
            if(Character.digit(s.charAt(i),10) < 0) return false;
        }
        return true;
    }
    public static void main(String[] args) {
        System.out.println("\nДобро пожаловать\nЧто вас интересует? \n1 - Увидеть текущий список\n2 - Редактировать текущий список");
        String result;
        Integer choice;
        Scanner scan1 = new Scanner(System.in);
        while (true) {
            result = scan1.next();
            if (isInteger(result)) {
                choice = Integer.valueOf(result);
                if (choice == 1 || choice == 2) {
                    break;
                }
                System.out.println("Вводит необходиу только цифры 1 и 2, попробуйте снова.\n");
            } else {
                System.out.println("Вводит необходиу только цифры 1 и 2, попробуйте снова.\n");
            }
        }
        System.out.println("Выбран " + choice + " вариант");
    }
}
Answer 3

Читайте строку и проверяйте - число это или нет. Самый просто способ - это парсить его и ловить NumberFormatException. Логика на try-catch это не очень хорошо, но в случае с парсингом числа я считаю очень даже оправдана в общем случае (в вашем же, раузмеется можно просто делать проверку вида line.equals("1") или line.equals("2")):

public static void main(String args []){
    System.out.println("\nДобро пожаловать\nЧто вас интересует? \n1 - Увидеть текущий список\n2 - Редактировать текущий список");
    Scanner scanner = new Scanner(System.in);
    Integer value = null;
    boolean correctValue;
    do {
        correctValue = true;
        String line = scanner.nextLine().trim();
        try {
            value = Integer.parseInt(line);
            if(value != 1 && value != 2){
                System.out.println("\nВы ввели неверное число, попробуйте снова.");
                correctValue = false;
            }
        } catch (NumberFormatException e){
            correctValue = false;
            System.out.println("Вводить необходимо только цифры, попробуйте снова.\n");
        }
    } while (!correctValue);
    System.out.println("Выбран " + value + " вариант");
}
Answer 4

В итоге, в процессе написания программы, я пришёл к тому, что мне нужен универсальный метод, в который приходит числовая переменная, означающая сколько пунктов условно говоря будет в меню, делает проверку на то, что введена ли цифра или буква, если всё ок - то проверяет, чтобы введённая пользователем цифра была не меньше 1 и не больше входной переменной в метод и если все проверки прошли успешно, то метод возвращает переменную, которую ввёл пользователь. Созданием этого метода я убил нескольких зайцев одновременно: Упростил значительно работу метода, сократил количество строк в методе, ну и самое главное - научил метод адаптироваться под изменение количества условных пунктов меню (их может быть хоть 5 хоть 50)

public static int SelectMenu (int r) {
    boolean CorrectValue;
    int result = 0;
    do {
        try {
            CorrectValue = true;
            Scanner scan1 = new Scanner(System.in);
            int select2 = scan1.nextInt();
            if (select2 < 1 | select2 > r) {
                System.out.println("Вы ввели неверную цифру, попробуйте ещё раз.");
                CorrectValue = false;
            } else {
                result = select2;
            }
        } catch (InputMismatchException e) {
            CorrectValue = false;
            System.out.println("Вводить необходимо только цифры! \nПопробуйте ещё раз");
        }
    } while (!CorrectValue);
    return result;
}
READ ALSO
Будильник на Android

Будильник на Android

Разрабатываю будильник для ознакомления со сферой разработки для AndroidПроблема в следующем: не работает будильник

200
static nested class? [дубликат]

static nested class? [дубликат]

На данный вопрос уже ответили:

177
Как получить ссылку со страницы в WebView?

Как получить ссылку со страницы в WebView?

Есть страница contentFinal, которая загружается в WebView через фильтры JsoupВ загруженной странице есть ссылки, ведущие на другие страницы сайта

150