1

配列内の特定のレコードを返すメソッドを作成していますが、2 つのエラーが発生し、修正方法がわかりません。誰かが私が間違っていることを説明できますか?

public String find(String searchName) 
{ // ERROR - MISSING RETURN STATEMENT
    Iterator<TelEntry> iterator = Directory.entries.iterator();
    boolean hasFound = false;
    while (iterator.hasNext()) 
    {
        TelEntry entry = iterator.next();

        if (entry.name.equalsIgnoreCase(searchName)) {
            return entry.name + entry.telNo;
            hasFound = true; // ERROR UNREACHABLE STATEMENT
        }

    }
    if (hasFound==false)
    {
        System.out.println("sorry, there is noone by that name in the Directory. Check your spelling and try again");
    }
}

誰かが私が間違ったことを説明できますか?

4

6 に答える 6

6

基本的な問題は、一致が見つからない場合、return ステートメントがないことです。通常、メソッドnullはそのような場合に戻りますが、戻りたい場合searchName、またはエラーメッセージさえも返すことができます-それはメソッドの意図/契約が何であるかに依存します(記載されていません)。

ただし、もう 1 つの問題は、コードが複雑すぎて、特にhasFound変数がまったく役に立たないことです。

コードを次のように変更します。これはまったく同じことを行いますが、よりエレガントに表現されています。

public String find(String searchName) {
    for (TelEntry entry : Directory.entries) {
        if (entry.name.equalsIgnoreCase(searchName)) {
            return entry.name + entry.telNo;
        }
    }
    System.out.println("sorry, there is noone by that name in the Directory. Check your spelling and try again");
    return null; // or return "searchName", the error message, or something else
}
于 2012-10-27T18:01:11.373 に答える
2

メソッドが文字列を返すように宣言されている場合、文字列を返すか、例外をスローする必要があります。何も返さないことは受け入れられません。そのため、文字列が見つからない場合の対処方法を決定する必要があります。基本的に次の 2 つの選択肢があります。

  • null を返す
  • 例外を投げる

エラーを出力するのは得策ではありません。このようなメソッドは、ユーザー インターフェイスを処理するべきではありません。それはその責任ではなく、メソッドは 1 つの責任のみを持つべきです。エラーメッセージとともに文字列を返すことも良い考えではありません: 呼び出し元は、返された文字列が見つかったものなのかエラー文字列なのかを知る方法がありません。

さらに、あなたのコードは非常に複雑です。次のように減らすことができます (Directory.entries()必要に応じて Iterable を実装すると仮定します)。

public String find(String searchName) {
    for (TelEntry entry: Directory.entries()) {
        if (entry.name.equalsIgnoreCase(searchName)) {
             return entry.name + entry.telNo;
        }
    }
    return null;
}

TelEntry戻り値の型を変更して、インスタンスを返すようにします。呼び出し元に連結を処理させます。このメソッドの責任でもありません。

于 2012-10-27T18:04:17.067 に答える
2

returnステートメントは、ブロック内の最後のステートメントである必要があります。以下のコードを変更します。

if (entry.name.equalsIgnoreCase(searchName)) {
            hasFound = true; // ERROR UNREACHABLE STATEMENT
            return entry.name + entry.telNo;
        }
于 2012-10-27T17:50:38.030 に答える
1

あなたのコードは正しくありません: 同じブロック内で return の後に命令を持つことはできません: 関数が返されたので、どのように実行できますか?


それがコンパイラがあなたに言っていることです:到達不能ステートメント

于 2012-10-28T10:34:19.207 に答える
0

文字列自体を返すことをお勧めします。実際、画面に印刷するとSRPに直接違反します(単一責任の原則であり、メソッドが期待するとおりに何かを返すことも避けてください)。

ブールチェッカーは必要ありません。

public String find(String searchName) { 
        Iterator<TelEntry> iterator = Directory.entries.iterator();
        while (iterator.hasNext()) {
            TelEntry entry = iterator.next();
            if (entry.name.equalsIgnoreCase(searchName)) {
                return entry.name + entry.telNo;
            }
        }
        return "sorry, there is noone by that name in the Directory. Check your spelling and try again";
}
于 2012-10-27T17:53:04.593 に答える
0

誰かが私が間違ったことを説明できますか?

私の説明は以下のコメントにあります:

public String find(String searchName) 
    { // ERROR - MISSING RETURN STATEMENT
        Iterator<TelEntry> iterator = Directory.entries.iterator();
        boolean hasFound = false;
        while (iterator.hasNext()) 
        {
            TelEntry entry = iterator.next();

            if (entry.name.equalsIgnoreCase(searchName)) {
                return entry.name + entry.telNo;
                /*The "return" statement above stops executing
                the current method and transfers control to the 
                place from where "find" method was called. The
                statement below this line is NEVER executed.*/
                hasFound = true; // ERROR UNREACHABLE STATEMENT
            }

        }
        if (hasFound==false)
        {
            System.out.println("sorry, there is noone by that name in the Directory. Check your spelling and try again");
        }
        /*This method starts with "public String". That means that 
        it MUST return a String object or null when the method 
        finishes executing.
        The best place to return is here.*/
    }
于 2012-10-27T18:12:53.073 に答える