0

シナリオでJavaで例外を処理する方法に関する提案を探しています。

Class A.test() 
{
    ClassB.test1()
}


test1()
{
   Map listOfExceptions = new HashMap();
   for()
   {
      try{
      }
      catch(custException e){
       // I want the for loop to continue even if there is an exception
       //So I am not throughing now rather adding the exception message to map with 
       //the field name for which for loop is running as key and message as value
      {
   }

// at some point if map has >0 records I want to throw an exception to classA.
}

ここでの質問は、スローされた例外に Map データを追加するにはどうすればよいですか? 基本的に、例外処理の一部として、呼び出し元のメソッドに送信される例外のリストが必要です。これを行う方法はありますか?答えがよく知られている場合、それは非常にばかげた質問かもしれませんが、正確な答えはどこにもありません。

4

4 に答える 4

7

List<Exception>繰り返しながら a を構築しないのはなぜですか? 次に、完了時に、そのリストが空でない場合はCustomException(から派生した) をスローし、その のフィールドとしてを提供します。ExceptionList<Exception>CustomException

を格納するのではList<Exception>なく、例外が発生するデータを表すList<Info>場所を選択することもできます。Infoその方が軽量化できそうです。

ErrorCollatorさらに良いのは、オブジェクトが発生したときに追加できるオブジェクトを作成することですExceptions。完了したら、 を呼び出します。ErrorCollator.throwExceptionIfReqd()そのオブジェクト自体が、例外をスローするかどうかを決定できます (単純に、Listが空でない場合)。そうすれば、一貫して使用できる再利用可能なコンポーネント/パターンが得られます。すぐに実行しない場合でも、おそらく取り組む価値があります。

于 2012-10-11T08:21:35.577 に答える
0

次のようなカスタム例外クラスを作成します

Class CustomException extends Exception{

Map listOfExceptions; 


CustomException (Map m){
  ListofExceptions=m;
 }
}

ここで、レコードが> 0またはその他の条件の場合に、この顧客例外をスローします。

throw new CustomException(listOfExceptions);
于 2012-10-11T08:24:56.217 に答える
0

以下のコードを試してください。サンプル コードでは、String を int に解析します。

配列の終わりまで、解析が続行されます。例外が発生した場合は、マップに配置します。マップには、 for ループが実行されているフィールド名がキーとして、例外メッセージが値として含まれています。

配列の最後で、呼び出しクラスに例外をスローする必要があるかどうかをマップで確認します。

public class ExceptionHadlingTest {

    public static void main(String[] args) {
        A1 a1 = new A1();
        a1.test();
    }
}
class A1 {
    public void test() {

        B1 b1= new B1();
        try {
            b1.test1();
        } catch (Exception e) {
        }
    }
}

class B1 {
    public void test1() throws Exception {
        Map<String, String> exceptions = new HashMap<String, String>();
        String[] array = {"1","a","2","b","6"};
        for (int i=0; i< array.length ; i++) {
            try {
                int a = Integer.parseInt(array[i]);
            } catch (Exception e) {
                exceptions.put(array[i], e.getMessage());
            }
        }
        if(exceptions.size() > 0) {
            System.out.println("Total Number of exception " + exceptions.size());
            for (Entry<String, String> entry : exceptions.entrySet()) {
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
            throw new Exception();
        }
    }
    private int parse(String str) {
        int a = Integer.parseInt(str);
        return a;
    }
}

for 内で customException を使用することもできます。

于 2012-10-11T08:54:34.357 に答える
0

HashMap に例外を追加する方法については、次のコードを確認してください。

public class ClassA {

    HashMap hm = new HashMap(); //HashMap Object that holds Exceptions

    public ClassA(){
        try {
            runA();
        } catch (Exception ex) {
            hm.put("a", ex); //put Exception in HashMap
        }
        try {
            runB();
        } catch (Exception ex) {
            hm.put("b", ex); //put Exception in HashMap
        }
    }

    private void runA() throws Exception {
        throw new Exception("a"); //Generate exception a
    }

    private void runB() throws Exception {
        throw new Exception("b"); //Generate exception b
    }
}

次に、いくつかのゲッター関数を提供して HashMap オブジェクトを取得し、このループ (Iterator) を使用して反復処理することで、このクラスを拡張できます。

// Get a set of the entries
Set set = hm.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while(i.hasNext()) {
  Map.Entry me = (Map.Entry)i.next();
  System.out.print(me.getKey() + ": ");
  System.out.println(me.getValue());
} 
于 2012-10-11T08:29:18.053 に答える