2016-03-30 4 views
1

В настоящее время я выполнил свое назначение программирования, которое, как говорили, использовало рекурсию для поиска факториала числа, которое вводит пользователь. Я успешно это сделал, и это сработало, но я решил немного расширить код и добавить исключения для ударов.Рекурсия и исключения Java

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

Вот мой код:

import java.util.Scanner; 

public class Recursion { 

    public static void main(String args[]) { 
     long userNum; 
     System.out.println("Enter a number to check it's factorial"); 
     Scanner scnr = new Scanner(System.in); 
     userNum = scnr.nextLong(); 
     StringTooLongException lengthException = 
     new StringTooLongException ("String has too many characters"); 

     System.out.println(fact(userNum)); 
    } 

    public static long fact(long userNum) { 
     try { 
     if(userNum < 0) { 
      throw lengthException; 
     } else if(userNum == 1 || userNum == 0) { 
      return 1; 
     } else { 
      return userNum*fact(userNum-1); 
     } 
     } catch(Exception e) { 
     System.out.println("Enter a number that is greater or equal to 0," + e); 
     } 

    } 
} 
+3

[IllegalArgumentException] (https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html) было бы лучше. Кроме того, я думаю, вы хотели сказать * «если пользователь вводит число, которое меньше **, чем 0, я хочу, чтобы исключение было выбрано». * –

+1

Вы должны бросать «новое StringTooLongException()», не 'lengthException'. Или вы можете переместить 'lengthException' в предложение' if'. – Tacocat

+3

Конкретная ошибка связана с тем, что исключение lengthException не подходит для метода 'fact (long userNum)'. Лично я бы рассмотрел IllegalArgumentException. – KevinO

ответ

2

Try:

throw new StringTooLongException(); 

И вы можете удалить следующее:

StringTooLongException lengthException = 
new StringTooLongException ("String has too many characters"); 

Хотя как @KevinO и другие предположили, что более подходит для использования IllegalArgumentException, например

throw new IllegalArgumentException(); 

Или, вы можете создать свой собственный Exception, например

public class InvalidInputException extends Exception { 
    public InvalidInputException(String message) { 
     super(message); 
    } 
} 

Вы объявили lengthException в main, и пытался использовать его в fact. Следовательно, он выходит за рамки метода fact(long userNum). Таким образом, вы получили ошибку.

Вы можете посмотреть this для получения дополнительной информации о exceptions.

+1

Извините, я редактировал, чтобы добавить это, когда вы добавили свой комментарий. Я был немного медленным. Пожалуйста, см. Пересмотренный ответ @JonnyHenly – Tacocat

0

Чтобы исправить вашу ошибку throwException, вам необходимо использовать . Также я думаю, что вы хотели использовать «throw new StringTooLongException();»

Вы также должны узнать больше о том, что такое исключение и для чего оно используется. Одно дело, что Exception на самом деле является классом, и любой подкласс класса Exception сам по себе является Исключением. Итак, если вы хотите, вы можете создать свое собственное исключение, просто расширив класс Exception. Вот почему вы должны использовать новое ключевое слово при бросании исключения: вы бросаете новый экземпляр Exception (или один из его подклассов).

Вы можете увидеть список некоторых исключений верхнего уровня, исследуя раздел прямых известных подклассов в JavaDoc for the Exception class.

0

Вы можете использовать NumberFormatException:

... 
if(userNum <= 0) 
{ 
    throw new NumberFormatException("Must be a positive integer"); 
} 
... 
} catch (NumberFormatException e) { 
    System.err.println("Enter a number that is greater or equal to 0," + e); 
} 
+0

Я не уверен, что это полностью соответствует: http://alvinalexander.com/blog/post/java/java-faq-what-is-numberformatexception; но я мог ошибаться. – Tacocat

0

Чистая альтернатива для реализации является создать свой собственный Exception, который соответствует вашим требованиям.

Например, вы можете создать собственный класс исключений следующим образом:

public class InvalidInputException() extends Exception 
{ 
    public InvalidInputException() 
    { 
     super(); 
    } 

    public InvalidInputException(String message) 
    { 
     super(message); 
    } 
} 

Эта реализация позволит вам throw new InvalidInputException() в вашей примерки поймать блок, и является более информативным для пользователей.

Смежные вопросы