Вычисление факториала для 0, приводящего к NoSuchElementException - PullRequest
0 голосов
/ 01 сентября 2018

Я должен вычислить факториал числа. Фактически, факториал 0 равен 1. Поэтому я включил этот случай и в функцию. вот код:

import java.util.*;
public class Factorial {
    static int fact(int n) {
        int result;
        if (n == 0 || n == 1)
            return 1;

        result = fact(n - 1) * n;
        return result;
    }
    public static void main(String args[]) {
        int i, fact = 1;
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        fact = fact(n);
        System.out.println(fact);
    }
}

но если я даю ввод в виде 0, возникло исключение

Исключение в потоке "main" java.util.NoSuchElementException на java.util.Scanner.throwFor (Scanner.java:862) на java.util.Scanner.next (Scanner.java:1485) на java.util.Scanner.nextInt (Scanner.java:2117) на java.util.Scanner.nextInt (Scanner.java:2076) at Factorial.main (Factorial.java:14)

Как разрешить эту ситуацию?

Правки:

  1. Я изменил исключение. Все извинения за то, что да, код не был даже 26 строк. Я разместил код выше в качестве комментариев, прежде чем публиковать здесь только код.
  2. Это не дубликат. На самом деле я хочу знать, почему он не принимает 0 в качестве входа. Он отлично работает для всех других входов.
  3. Я использую онлайн-компилятор https://www.tutorialspoint.com/compile_java_online.php
  4. Прекрасно работает с компилятором Java для ПК JDK 1.7, но вызывает исключение в онлайн-среде IDE.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Интернет-среда, вероятно, выполняет некоторую предварительную обработку данных, которые не очень хорошо играет с нулями.

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

Я столкнулся с противоположной проблемой в стандарте C с функцией sscanf, который ожидал потерпеть неудачу (вернуть 0), когда входная строка пуста, как и ее сестринская функция scanf, но она все еще возвращает успех и сохраняет ноль в целом числе переменные.

Кстати, если вы просто добавите начальный пробел или \ n к нулю, все работает просто отлично.

0 голосов
/ 01 сентября 2018

NoSuchElementException будет выброшено, если больше нет доступных токенов. Это вызвано вызовом nextInt () без проверки, доступно ли какое-либо целое число. Чтобы этого не происходило, вы можете рассмотреть возможность использования hasNextInt () для проверки наличия дополнительных токенов. Link .

Модифицировал ваш код и добавил hasNextInt, чтобы NoSuchElementException не генерировалось и sc.close() для закрытия ресурса в конце main Метод

public static void main(String args[]) {
    int fact = 1;
    Scanner sc = new Scanner(System.in);
    if (sc.hasNextInt()) {
        int n = sc.nextInt();
        fact = fact(n);
        System.out.println(fact);
    }
    sc.close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...