3

まず、null ポインターのスタックオーバーフローに関する質問がたくさんありますが、これは見つかりませんでした。それが存在し、私はそれを見つけられなかったので、私の間違いを惜しまないでください.

質問は一般的です-関数が1つの要素のみを返す場合、欠落している「要素」のケースをどのように処理するか。例: サンプル コードは単なるサンプルです。

public int findSmallestNumberGreaterThanX(int a[], int x) {
  // do what ever logic.
  if (numFound) { return smallesNumberGreaterThanX; }
  else {
     // what ??
   }
}

配列に x より大きい数値がなかった場合 - どうすればよいですか?

  1. 効果的な Java の言及は、null ポインターではなく空の配列を返しますが、関数が単一の要素を返す場合、配列を作成する価値はありますか?

  2. 次のオプションは return null です。null を返すという考えを拒否する投稿をたくさん見てきました。

  3. 3 つ目は、オブジェクト { boolean found; を返すことです。int 値; } . これはやり過ぎのように聞こえます。

ここで最善のアプローチを提案してください。

4

7 に答える 7

3

関数が何を返すかによって異なります。値を返す場合、どの値も有効であるため、戻り値を有効性の制御に使用することはできません。

配列で見つかった値のインデックスを返す場合、ゼロ未満のものはすべて不正な値と見なされ、エラー コードに使用できます。

おそらく、戻り値を含むパラメーターを追加し、関数を変更して、数値が見つかったかどうかを示すブール値を返すようにすることができます

于 2013-06-22T23:42:16.577 に答える
3

この問題を解決する方法はいくつかあります。(1)または(2)を使用し、(3)および(4)を避けることをお勧めします。

(1): 例外をスローします。メソッドは次のようになります。

public int findSmallestNumberGreaterThanX(int a[], int x)
    throws NoSuchNumberException {
  // do what ever logic.
  if (numFound) { return smallestNumberGreaterThanX; }
  else {
    throw new NoSuchNumberException();
   }
}

と言って呼び出されます

try {
  int smallestNum = findSmallestNumberGreaterThanX(a, x);
  //use smallestNum
} catch(NoSuchNumberException e) {
  //handle case where there is no smallestNum
}

クラス NoSuchNumberException も作成する必要があります。

public class NoSuchNumberException extends Exception {

  public NoSuchNumberException() {}

  public NoSuchNumberException(String message) {
    super(message);
  }
}


(2): コードを少しリファクタリングします。

すべてを 1 つのメソッドで行うのではなく、メソッドを作成する

public int findSmallestNumber(int a[]) {...}

そして言う

int smallestNum = findSmallestNumber(a);
if (smallestNum > x) {
  //use smallestNum
} else {
  //handle case where there is no smallestNum > x
}


(3): 戻り値の型を Integer に設定し、null を返します。Java は int と Integer の間で自動的にキャストし、null は Integer の有効な値です。null を int にキャストしようとすると壊れてしまうため、このメソッドを使用する場所では必ず null をチェックしてください。


(4): x より小さい数値を返します。(その数値を何らかの方法で使用できる場合を除き、この解決策を使用しないことを強くお勧めします。) 数値が x より小さいため、エラー状態として識別できます。

于 2013-06-22T23:59:03.823 に答える
3

比較が厳密な場合は、別の方法で返すことができない唯一の値であるため、Integer.MIN_VALUE を返すことができます。(それ自体を除く他のすべての値よりも小さいため)。

于 2013-06-22T23:37:11.327 に答える
2

smallesNumberGreaterThanXにそれ自体が含まれていない場合は、次のxようなものを使用できます。

public int findSmallestNumberGreaterThanX(int a[], int x) {
  // do what ever logic.
  if (numFound) { return smallesNumberGreaterThanX; }
  else {
     return x;
   }
}

メソッドを呼び出す間、次のように使用できます。

int var = findSmallestNumberGreaterThanX(a ,x);
if (var == x)
{
    System.out.println("No value found");
}
于 2013-06-22T23:42:11.580 に答える
2

まだ言及されていないもう1つの解決策があります:

要素自体を返す代わりに、そのインデックスを返します。そのような要素がない場合は、-1 または配列サイズを返します。このアプローチは、反復子を使用する C++ では非常に一般的です。

于 2013-06-23T08:54:54.803 に答える
0

「見つからない」結果に対して null を返すことは非常に一般的です。などの「特別な」値を返すInteger.MIN_VALUEことは問題ありません。これは数学的に正当な結果ではないためですが、呼び出し元が対処するのは型にはまらないアプローチです。

次の 2 つのオプションがあります。

  1. 見つからない場合は例外をスローする
  2. 戻り値の型をオブジェクト型に変更して null を返す

オプション 1. は一般的には良い考えではありませんが、どうしても int を返さなければならない場合は、それを使用してください。

オプション 2. はより一般的な解決策であり、javadoc で文書化されています

/**
 * @returns null if not found
 */
public Integer findSmallestNumberGreaterThanX(int a[], int x) {
    // do what ever logic.
    if (numFound)
        return smallesNumberGreaterThanX;
    return null;
}
于 2013-06-23T00:26:29.970 に答える