-1

タイトルに少し苦労しました。より正確に表現する方法がわかりませんでした。

Doubleこの問題が発生しています。ユーザーに 3 つの入力を求める方法がいくつかあります。入力ごとに、それが有効かどうか (たとえば、正の値かどうか) をチェックし、そうでない場合はIllegalArgumentException. 次に、メソッドが正しく機能しているかどうかを確認する Tester クラスを作成しました。メソッドによってスローされた例外をキャッチし、その特定の例外の原因となった入力をユーザーに再度尋ねることになっています。

3 つのメソッドはすべてスローしIllegalArgumentExceptionますが、エラー メッセージはそれぞれ異なります。とにかく(例外をキャッチするときに)どの入力がエラーを引き起こしているかを確認することはできますか?これが私のコードのサンプルです:

public class account
{
   double value;
   public account(double initialValue)
   {
      if (initialValue < 0)
      {
         throw new IllegalArgumentException("Initial value cannot be negative.");
      }
      value = initialValue;
   }
   public add(double addValue)
   {
      if (addValue < 0)
      {
         throw new IllegalArgumentException("Added value cannot be negative.");
      }
      value = value + addValue;
   }
}

テスタークラスは次のようになります。

public class accountTester
{
   public static void main(String[] args)
   {
      try
      {
         double initialValue = Double.parseDouble(JOptionPane.showInputDialog("Enter initial value"));
         account acc = new account(initialValue);

         double addValue = Double.parseDouble(JOptionPane.showInputDialog("Enter value to add"));
         acc.add(addValue);
      } catch (Exception e) {
         System.out.println("Wrong ammount");
         initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount"));
    }
}

IllegalArgumentExceptionしたがって、 「初期値を負にすることはできません」の場合にのみそのコードをスローするには、テスター クラスで何を変更する必要がありますか。

わかりにくかったらすいません。

編集:私の教授によると、私たちは do を使用することになっています

String error = e.toString;
if (error.contains("Added value cannot be negative.")
{
    //DO CODE FOR FIRST ERROR
}

ただし、これが最も適切な方法ではないことはわかっています。

4

3 に答える 3

2

関数型言語のように突き合わせできないため、 try-catchメカニズムStringsを使用してそれらを区別できるようにする場合は、3 つの異なる種類のオブジェクトを提供する必要があります。

または、単純化されたアプローチでは、パラメーターを例外にアタッチして、catch句のみを使用できるようにしますが、異なる動作をすることができます。何かのようなもの

class MyIllegalArgumentException extends IllegalArgumentException {
  public int whichParameter;

  public MyIllegalArgumentException(String string, int which) {
    super(string);
    whichParameter = which;
  }
}

次のことができるようになりました。

catch (MyIllegalArgumentException e) {
  if (e.whichParameter == 0)
    ..
  else if (e.whichParameter == 1)
    ..
}

文字列が等しいかどうかをチェックすることもできますが、これは実際には適切な設計上の選択ではありません。多くのtry-catchブロックを使用することもできますが、常に可能であるとは限りません。

コードを拡張した後、ソリューションは簡単です。

public static void main(String[] args) {
  try {
    double initialValue = ...
    account acc = new account(initialValue);
   } catch (IllegalArgumentException e) {
     ...
   }

   try {    
     double addValue = ...
     acc.add(addValue);
   } catch (Exception e) {
         System.out.println("Wrong ammount");
         initialValue = Double.parseDouble(JOptionPane.showInputDialog("Re-enter ammount"));
   }
 }
于 2012-03-03T03:07:26.473 に答える
0

catchブロックでは、IllegalArgumentExceptionのみをキャッチする必要があります。次にgetMessage()、非常に単純なString.equals呼び出しを実行できるようにする関数を呼び出すことができます。

于 2012-03-03T03:37:32.187 に答える
0

各メソッド呼び出しを独自の try/catch ブロックで囲みますか?

于 2012-03-03T03:05:58.083 に答える