11

ByteArrayOutputStream単にメモリに書き込むだけなので、IOException発生することはありません。ただし、OutputStreamインターフェイスの契約により、すべてのストリーム操作IOExceptionはそのthrows句で定義されます。

この発生しないことを「処理」する正しい方法は何IOExceptionですか?単に操作を空のtry-catchブロックにラップしますか?

またはByteArrayOutputStream、例外をスローする可能性のある実際の状況はありますか?

(参照:安全で読みやすい方法で、スローされないことがわかっているIOExceptionを処理するにはどうすればよいですか?

編集

Jonが指摘しているように、定義するメソッドの句をByteArrayOutputStream宣言していませんが、それはから継承し、スローします(スーパークラスのバージョンを置き換える可能性があるため、このメソッドをオーバーライドしないのはかなり奇妙です)。一度に1バイトを書き込みます-はるかに効率的な呼び出しで)throwswritewrite(byte[])OutputStreamIOEXceptionBAOSarraycopy

4

6 に答える 6

11

まあ、そのメソッドのいずれかがとを除いてスローすることを宣言してByteArrayOutputStream いません。(正直なところ、なぜまだ宣言しているのかわかりません。)IOExceptionwriteTocloseclose

ただし、型の参照がある場合OutputStreamでも、もちろん、そこからのthrows宣言が表示されます。

空のcatchブロックは使用しません。次のようなIllegalStateExceptionチェックされていない例外をスローします。これは、実際には予期しない状況にあり、何かがひどく間違っていることを意味します

于 2011-06-07T21:41:17.157 に答える
2

ByteArrayOutputStream.writeが実際にはIOExceptionを宣言していないことに気づきましたが、Eclipseは、使用するたびに未処理の例外について文句を言います...奇妙です。

それは簡単に説明できます。あなたはおそらくこのようなことをしたでしょう:

    OutputStream os = new ByteArrayOutputStream();
    ...
    os.write();

「問題」は、メソッドをOutputStream.write()ではなくとして呼び出していることですByteArrayOutputStream.write()。したがって、コンパイラは次のように言います。

「ああ...缶に投げることができるwrite()ので、あなたはそれに対処しなければなりません。」OutputStreamIOException

それは言うことはできません:

「これOutputStreamは本当にByteArrayOutputStream...だから私たちはあなたを失望させます。」

JLSでは許可されていないためです。

これは、実装クラスではなくインターフェイスにコーディングすることで「ベストプラクティス」に従うことが、あなたに噛み付くようなエッジケースの1つです。

OKそう...

  • その穏やかなニップ、完全なかみ傷ではありません。
  • OutputStreamはJavaインターフェイスではなくJavaクラスとして実装されていますが、それは重要なことではありません。
  • ほとんどのコンパイラは、コードのコンパイル中に実際に会話を行うことはありません:-)

于 2011-06-08T02:42:13.720 に答える
1

典型的な決まり文句はthrow new RuntimeException(theIOException)、キャッチブロックにあります。不可能が起こった場合、少なくともそれについて知ることができます。

于 2011-06-07T21:50:05.483 に答える
1

この状況では、例外の連鎖がベストプラクティスです。つまり、RuntimeExceptionをスローします。

于 2011-06-07T22:07:58.977 に答える
1

2002年以降、この問題の拡張チケットがあります。これが修正されない理由は、以前のJavaバージョンとの互換性に影響を与えるためです。

ここでは、私が検討する2つの回避策に従います。

回避策1

このwrite(byte[], int, int)メソッドは、チェックされた例外をスローしません。2つの追加パラメーターを指定するのはもう少し冗長です。しかし、すべてのフットプリントは、トライキャッチなしでは小さくなります。

baos.write(array, 0, array.length);

回避策2

別の可能な解決策は、内部で例外をキャッチする独自のByteUtilクラスを作成することです。

public final class ByteUtil
{
  public static void write(ByteArrayOutputStream baos, byte[] bytes)
  {
    try
    {
      baos.write(bytes);
    }
    catch (IOException e)
    {
      // impossible
    }
  }
}

// usage
ByteUtil.write(baos, bytes);
于 2018-06-07T10:35:17.280 に答える
1

Java 11以降、同様にスローしない新しいメソッドもあります。 ByteArrayOutputStream.writeBytes(byte[])IOException

/**
 * Writes the complete contents of the specified byte array
 * to this {@code ByteArrayOutputStream}.
 *
 * ...
 *
 * @since   11
 */
public void writeBytes(byte b[]) {
    write(b, 0, b.length);
}

IOExceptionスローされないを処理したくない場合は、このメソッドを使用できます。

于 2018-09-13T07:40:30.863 に答える