Параметры Character.isDigit и строки недоступных ошибок в методе isDigit (пояснение) - PullRequest
0 голосов
/ 04 февраля 2019

В настоящее время я работаю над небольшим проектом для вводного Java-класса.Мы должны создать программу, которая может принимать целое число от пользователя и выводить число шансов, четных и нулевых значений, присутствующих в коде.Мне это показалось довольно простым, и мне удалось реализовать код, но одноклассник, после того как я раскритиковал его код за неправильное следование подсказке, заметил, что мой код зависнет, если будет введено что-либо, кроме цифр.

Несмотря на это, я попытался выйти за рамки приглашения и заставить программу вывести сообщение об ошибке, если она встречает символы помимо цифр (вместо того, чтобы мой компилятор возвращал ошибку).Однако я возвращаю несколько ошибок в компиляторе Eclipse при использовании метода isDigit в классе Character.

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

package ppCH5;
import java.util.Scanner;

public class PP5_3
{
    public static void main(String[]args)
    {   
        int even = 0;
        int odd = 0;
        int zero = 0;
        int num = 0;
        int count = 0;

        boolean inputError = false;
        System.out.println("please provide some integer");
        Scanner scan = new Scanner(System.in);
        String numbers = scan.next();
        scan.close();
        Scanner intSeperate = new Scanner(numbers);
        intSeperate.useDelimiter("");

        while(intSeperate.hasNext())
        {
                if(Character.isDigit(numbers.charAt(count)))
                {
                    count++;
                    num = intSeperate.nextInt();
                    if((num % 2)==1)
                        odd++;
                    if((num % 2)==0)
                        if(num==0)
                            zero++;
                        else
                            even++;
                }
                else
                {
                    count++;
                    inputError = true;
            }
        }
        intSeperate.close();
        if(!inputError)
        {
            System.out.println("There are " + even + " even digits.\n" + odd     + " odd digits.\nAnd there are " + zero + " zeros in that integer.");
        }
        else
        {
            System.out.println("You have provided a disallowed input");
        }
    }
}

Любая помощь будет оценена, я в настоящее время в растерянности.

1 Ответ

0 голосов
/ 04 февраля 2019

Когда вы вводите один нецифровый символ, скажем a, ветвь else внутри цикла while будет выполняться, увеличивая count, верно?И тогда цикл начнет новую итерацию, верно?

В этой новой итерации intSeparator.hasNext() все еще возвращает true.Зачем?Поскольку вход a никогда не считывается сканером (в отличие от того, что вы ввели цифру, будет вызван intSeparator.nextInt, который будет использовать ввод).

Теперь count равен 1 инедопустимый индекс для строки из 1 символа.Следовательно, numbers.charAt(count) выдает исключение.

Этого можно избежать, если вы break; вышли из цикла сразу в блоке else:

else
{
    inputError = true;
    break;
}

Кроме того, не close сканер scan.scan подключен к потоку System.in.Вы не открыли этот поток, поэтому не закрывайте его сами.

...