2016-03-30 17 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

'new StringTooLongException()'を投げているはずです。 'lengthException'ではありません。または、 'length'を' if'節に移動することもできます。 – Tacocat

+3

特定のエラーは、lengthExceptionがメソッド 'fact(long userNum)'の有効範囲外であるためです。個人的には、私はIllegalArgumentExceptionを検討します。 – KevinO

答えて

2

試してみてください。

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); 
    } 
} 

あなたはmainlengthExceptionを宣言し、factでそれを使用しようとしました。したがって、方法fact(long userNum)の範囲外です。したがって、あなたが持っているエラー。

exceptionsについてはthisをご覧ください。

+1

申し訳ありません、私はあなたのコメントを追加したときにそれを含めるように編集していました。私は少し遅かった。私はそれが完全に適切であるかどうかはわかりません:http://alvinalexander.com/blog/post/java/java-faq-what-is-numberformatexception;改訂された答え、@JonnyHenly – Tacocat

0

throw length errorExceptionを修正するには、新しいを使用する必要があります。また、私はあなたが '新しいStringTooLongException()をスローすることを意味すると思う;

また、例外の内容とその用途についても学習する必要があります。例外の1つは実際にはクラスであり、Exceptionクラスのサブクラス自体は例外です。だから、もし望むのであれば、Exceptionクラスを拡張するだけで独自の例外を作成することができます。このため、例外をスローするときに新しいキーワード(例外の新しいインスタンス(またはそのサブクラスの1つ))をスローしなければならない理由があります。

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

を参照してください。私は間違っている可能性があります。 – Tacocat

0

実装のためのクリーンな代替が要件に合った独自のカスタム例外を作成することです。

たとえば、次のようにして独自の例外クラスを作成することができます。

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

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

をこの実装は、あなたのtry-catchブロックでthrow new InvalidInputException()にあなたを可能にし、ユーザにとってより有益であるだろう。