27

出力ストリームを作成するオープン ソース プロジェクトを行っていたところ、次の方法に出会いました。

@Override public void write(byte[] buffer, int offset, int length) {
    if (buffer == null) {
        throw new NullPointerException("buffer is null");
    }
    if (buffer.length < 0) { // NOTE HERE
        throw new IllegalArgumentException("buffer length < 0");
    }
    if (offset < 0) {
        throw new IndexOutOfBoundsException(String.format("offset %d < 0", offset));
    }
    if (length < 0) {
        throw new IndexOutOfBoundsException(String.format("length %d < 0", length));
    }
    if (offset > buffer.length || length > buffer.length - offset) {
        throw new IndexOutOfBoundsException(String.format("offset %d + length %d > buffer"                                                       " length %d", offset, length, buffer.length));
    }
}

したがって、byte[] bufferは普通の古いbyte[]. null ではないことがわかっています。長さを0未満にすることさえ可能ですか?たとえば、リフレクションでそれを行うことができますか?それが彼らが防御しているものですか?

4

3 に答える 3

34

いいえ、これは決して起こり得ません。長さは、Java 仕様に従って負でないことが保証されています。

配列型のメンバーは、次のすべてです。

  • 配列のコンポーネントの数を含む public final フィールドの長さ。length は正またはゼロの場合があります

出典: JLS §10.7

mprivat が述べたように、負のサイズの配列を作成しようとすると、NegativeArraySizeExceptionがスローされます。

于 2012-07-17T20:03:56.847 に答える
6

私はそれが可能だとは思わない。リフレクションを介しても、NegativeArraySizeExceptionで保護されます

于 2012-07-17T20:02:46.893 に答える