2017-11-29 4 views
0

EDIT: 申し訳ありませんが、私はすでにこのプログラムを書いています。私はすでにこれをしようとしていますが、ネストしたものを使ってこれを完成させました。例外クラスを書く練習です。私はこれまでに書いた方法よりも効率が悪いですが、私はjavaについてさらに学ぶためにこれをやろうとしています。再度、感謝します。ユーザが入力したユーザ文字列が受け入れられない場合にスローする例外クラスを記述する

「print、sortfirst、sortlast、sortgrade」と入力できる文字列は基本的に唯一のもので、if文を書くことなく書く方法はわかりません。

私が書いたクラスは、

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

私はこのクラスで引数を構築する必要がありますか、またはwhileループの中のメインクラスでユーザー入力を読み込みますか?

+0

のですか?コマンドライン引数? java.util.Scanner? –

+0

ifを避けるために 'Arrays.asList(" print "、" sortfirst "etc).contains(message)'を使うことができます。しかし、とにかくやりたいことをするのは悪い考えです。 –

+0

@JarrodRoberson私はスキャナーを使用していますが、これは既に提出して渡した古いプロジェクトです。異なる種類の例外処理を実行するだけです。 – GonePhisin

答えて

0

あなたのビジネスを例外の中にバインドすることは、悪いアイデア/デザインです。

必要な場所を確認し、間違ったことを入力した場合はこの例外を使用してください。

whileループ内にユーザーを確認する条件を入れます。そうすれば、プロジェクト全体でこの例外を再利用できます。

ifのネストされた部分に来て、あらかじめ定義された値を持つ配列を作成し、配列内の入力値をチェックするかどうかを単純なループで調べます。そうすれば、それを減らすことができます。

0

一般に、実行時にプログラムの正常な動作が停止するため、誤った入力の問題を解決するのは良い考えではありません。 whileループで別の入力を求めたり、入力が正しくないときに何らかのエラーメッセージを表示したりするより良い方法があります。

あなたはまだそれがあるString引数を取るコンストラクタを作成するために良いことだ、それは私がString sに入力された値を割り当てることをお勧めあなたの状況で最高のアイデアだと思うし、あなたの例外クラスを作成する場合

(if "print".equals(s) || "sortfirst".equals(s) || ...)) 
    { throw new WrongCommandException("Your message here") } 

でそれを確認した場合例外がスローされたときに表示されます。

しかし、あなたの状況では、例外を投げたり、例外の本体にチェックを入れたりするのではなく、main()メソッドのwhileループで必要なチェックをすべて行うことをお勧めします。

+1

私が書いたプログラムはすでに完成しています。ループとネストされたifsが受け入れ可能なコマンドのために使用されていますが、今は例外処理を行っていますが、それははるかに効率的ではないことがわかっているはずです。私のコンピュータに戻って – GonePhisin

+0

@GonePhisin私はあなたの質問を編集して、このコメントであなたがあなたの問題をより良く理解できるようにするためにこのコメントに加えた追加情報を入れることをお勧めしたいと思います。あなたの幸せを祈ります。 –

1

あなたのアプローチの問題は、実行時にコードが失敗する新しい方法を追加することを提案していることです。また、他のランタイムエラー(つまり、最初に例外をスローしている理由)を処理しようとしているときにランタイムエラーが発生すると、悪い考えです。

コンパイル時に無効な入力を使用できないようにします。有限数の入力のみを受け入れる場合は、

  • 各入力の例外の特定のサブクラスを作成します。
  • 例外クラスに静的なファクトリメソッドを提供します。各メソッドは特定の入力に対して例外を構成します。
  • 有効な入力ごとに1つの値を設定し、インスタンスをコンストラクタに渡します。
+0

ここでは列挙型を使用してください。これは完璧な使用例です。しかし、それがサポートされているコマンドであれば、なぜこれが例外になるのかは分かりません。 – Krease

0

ビジネスロジックは例外の内側に行くが、非常に明示的な例外メッセージを持つことは、保守系を有するために重要であることはありません。ここで

public InvalidCommandException extends FormattedRuntimeException 
{ 
    public InvalidCommandException(@Nonnull final String command) 
    { 
     super("(%s) is not a valid command. Valid command are [print, sortfirst, sortlast, sortgrade]!", command); 
    } 
} 

はどのように入力を読んでいるFormattedRuntimeException

/** 
* This is a convenience facade class to enable simple message creation as the String.format() 
* facilities instead of manually building strings to pass in as a message. 
* <p/> 
*/ 
public class FormattedRuntimeException extends RuntimeException 
{ 
    protected FormattedRuntimeException(@Nonnull final String format, @Nonnull Object... args) 
    { 
     super(String.format(format, args)); 
    } 

    protected FormattedRuntimeException(@Nonnull final Throwable cause, @Nonnull String format, @Nonnull Object... args) 
    { 
     super(String.format(format, args), cause); 
    } 

    /** 
    * This no-arg constructor is hidden specifically to keep people from using it 
    */ 
    private FormattedRuntimeException() 
    { /* keep people from using "anonymous" instances */ } 

    /** 
    * This Exception only constructor is hidden specifically to keep people from using it 
    */ 
    private FormattedRuntimeException(final Exception e) 
    { /* keep people from using "anonymous" instances */ } 
} 
関連する問題