2016-08-17 3 views
1

これは本当に私が説明するのは非常に難しいので、私に同行してください。プロセスをメインに戻す際に例外を使用する必要がありますか?

私は、特定の状況が満たされたときに、すべての連鎖されたメソッドをメインメソッドに戻す最善の方法について考えています。例えば、私がMainからメソッドへの呼び出しを行い、そのメソッドから別のメソッドを呼び出すなどとします。ある時点で、チェーンされているすべてのメソッドのすべての操作を取り消し、単にMainメソッドに戻ることができます。これを行う最善の方法は何ですか?

私はシナリオあげる:EGインクルード(方法1がNULL値で方法2を呼び出したときにしかし、それは方法2で、さらに操作することなく、バックメインにすべての方法をほどく必要があり、3つの方法があり、以下のコードでは

を"たくさんの他のコード"セクション)。

public static void main(String[] args) 
{ 
    try 
    { 
     Method1(); 
    } 
    catch(ReturnToMainException e) 
    { 
     // Handle return \\ 
    } 
} 

public static void Method1() throws ReturnToMainException 
{ 
    String someString = null; 
    Method2(someString ); 

    // Lots more code after here 
} 

public static boolean Method2(String someString) 
{ 
    if(someString == null) 
     throw new ReturnToMainException(); 
    else if(someString.equals("Correct")) 
     return true; 
    else 
     return false; 
} 

この例では、読んだスローを「例外的な状況」でのみ使用してください。私はこの問題に遭遇し、問題を解決するために単にIf/Elseステートメントを実行していることがよくありますが、True/Falseを返すだけのメソッドを扱うときは、アクションを決めるための十分なオプションがありません。私は列挙子やクラスを使うことができると思いますが、やや面倒です。

+1

「巻き戻し」が「カスケード」よりも適切だと思います。 – ChiefTwoPencils

+0

@ChiefTwoPencilsええ、おそらく正しいでしょう:) –

+0

もう一つのポイントは、一貫性のない戻り値の型があることです。あなたはブーンを最初の方法に戻すことができましたが、それではどうしますか? – ChiefTwoPencils

答えて

2

私が読んだスローは、「例外的な状況」でのみ使用してください。それは慎重に考えなしに使用すべきではありませんが、私はあなたの例は、のOK例であると信じているので、問題を解決するために/ else文が

例外投げは比較的高価であるならば、私は多くの場合、この問題が発生したと私は単純にやって見つけます適切な使用。

一般に、プログラムの「例外的な」動作に対してのみ例外を使用する必要があります。 someStringnullの場合、ユーザー入力、データベース値、またはその他の通常のメカニズムを使用して、通常は可能ならば通常の戻りメカニズムでそのケースを処理する必要があります。

Booleanオブジェクト(プリミティブではない)を返すことができ、someStringがnullの場合はnullを返します。

private static Boolean method2(String someString) { 
    if (someString == null) { 
     return null; 
    } 
    ... 
} 

その後、あなたは多分方法が「働いていた」かどうかに基づいてmainbooleanを返し、呼び出し元に適切nullを処理します。 method1が「働いていた」場合

private static boolean method1() { 
    ... 
    Boolean result = method2(someString); 
    if (result == null) { 
     // the method didn't "work" 
     return false; 
    } 

次にメインに、あなたは見ることができます:私はあなたのメソッド名をdowncasedと良いパターンですprivate両方にあなたの方法のパーミッションを変更し

public static void main(String[] args) { 
    if (!method1()) { 
     // handle error 
    } 
    ... 
} 

注意してください。

列挙子またはクラスですが、やや面倒です。

確かにそうです。このコードがどのように使われているかは少し異なります。それが他の人によって呼び出されるAPIメソッドである場合は、のようなフィードバックをbooleanのように返すかもしれない何らかの種類のResultクラスを返すことができます。その場合はIllegalArgumentExceptionを投げるかもしれません。代わりに、これが内部ローカルプライベートメソッドであれば、引数エラーを処理する簡単な方法に投票します。いずれにしてもjavadocを使用して動作を文書化して、将来あなたのことを考えないようにしてください。

これが役に立ちます。

+0

私は物事をひどく言いましたが、あなたは正確に自分のポイントを拾うように見えました。私はあなたの答えを期待していましたが、何か貴重なものがないかどうかはわかりませんでした。私はあなたの返信に感謝し、それは私に心のいくつかの部分を与えている:)また、私は大文字のメソッド名の最近悪い習慣を(ピックアップしたC#から) –

関連する問題