1

ソフトウェア ベンダーが提供する Connection クラスのメソッドを使用する必要があるとします。ドキュメントには、次のメソッド宣言が示されています。

public String getData(String command) throws IOException

次のコードでは、getData メソッドを使用して String 形式でデータを取得し、そのデータを出力コンソールに出力しようとしています。しかし、IDE は、コードに例外処理関連のエラーがあることを示しています。

public void processData(Connection conn, String command) {
  String res = conn.getData(command);
  System.out.println(res);
}

エラーを修正するにはどうすればよいですか?

4

4 に答える 4

1

簡単な方法は、このコードが例外をスローできることを Java に伝えることです。

public void processData(Connection conn, String command) throws IOException {
  String res = conn.getData(command);
  System.out.println(res);
}

ただし、例外を自分でキャッチすることもできます。

public void processData(Connection conn, String command) {
  try {
    String res = conn.getData(command);
    System.out.println(res);
  } catch(IOException e) {
    e.printStackTrace();
  }
}
于 2012-07-03T02:49:54.253 に答える
0

例外をキャッチします (例外を適切に処理する方法を知っている場合):

try {
    String res = conn.getData(command);
    System.out.println(res);
} catch (IOException e) {
    // handle it
}

または、このメソッドに例外仕様を置きます。

public void processData(Connection conn, String command) throws IOException
于 2012-07-03T02:51:17.287 に答える
0

☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠</h1>

アンチパターンをしないでください!

☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠ ☠</h1>
try {
    String res = conn.getData(command);
    System.out.println(res);
} catch (IOException e) {
    throw new RuntimeException(e);
}

于 2012-07-03T03:03:08.803 に答える
0

基本的に 2 つの適切な選択肢があります。

選択肢 1:
例外を適切に処理できる場合は、次のようにします。

try {
    String res = conn.getData(command);
} catch (IOException e) {
    // do something sensible, perhaps return null or a default value etc
}

これは、例外を処理するために呼び出し元に負担をかけないため、理にかなっている場合、通常は適切なオプションです。


選択肢 2:
例外を合理的に処理できない場合は、メソッドに例外をスローさせます。ここでの設計上の問題は、どの例外をスローするかです。

例外がコードの残りの部分に「うまく適合する」場合は、メソッドを宣言して、サードパーティのライブラリから期待される例外をスローするだけです。

public void processData(Connection conn, String command) throws IOException

ただし、多くの場合、サード パーティのライブラリを呼び出すと、スローされる例外がアプリケーションと互換性がありません。あなたの場合、IOExceptionアプリケーションのドメインの完全に外側にある可能性があり、サードパーティの実装がリモートサーバーにアクセスするためにのみスローされ(たとえば)、スローIOExceptionすると、コードに「うまく適合しない」新しい例外が導入されますその目的 (例えば、あなたのアプリケーションはリモートサーバーの使用とは何の関係もないかもしれません)。

このような場合、例外をドメイン例外でラップし、代わりにそれをスローするのが最善です。例えば:

public void processData(Connection conn, String command) throws ProcessingException
    try {
        String res = conn.getData(command);
    } catch (IOException e) {
        throw new ProcessingException(e);
    }
}

これを実現するには、次のような Exception クラスを作成します。

public class ProcessingException extends Exception {}

これで、さらに選択肢ができました。例外が発生することが予想されない場合、つまり、発生しないことを確認するための適切な措置を講じている場合 (環境が正しいことを確認するなど)、チェックされていない例外をスローするオプションがあります。

public void processData(Connection conn, String command)
    try {
        String res = conn.getData(command);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

このバージョンは基本的に、例外は予期されていないことを示しており、状況はどのレベルでも回復できないため、コードを作成するつもりはありません。キャッチException

これは「アンチパターン」ではありません。なぜならNullPointerException、他のすべての一般的なチェックされていない例外と並んでおり、それらもキャッチしないからです。

于 2012-07-03T03:29:48.307 に答える