2012-07-17 44 views
24

我經歷了他們所創建的輸出流的一個開源項目,並遇到下列方法來:Java數組長度小於0?

@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[]。我們知道它不是空的。它甚至有可能使它的長度小於0嗎?喜歡,可以用反射完成,這就是他們所防範的?

+0

你是什麼意思「我們知道它不是'null'」? – 2012-07-17 20:02:05

+3

@EdwardThomson:我認爲是因爲第一條語句檢查'buffer == null' – 2012-07-17 20:02:51

+0

也許在該項目的其他地方,它是一個約定,'-1'是一種有效的方式來表示索引是無效的或類似的這裏終於變成了一個例外。 – thalador 2012-07-17 20:03:28

回答

29

不,這不會發生。根據Java規範,長度保證是非負的。

數組類型的成員是以下的所有:

  • 公共最終字段長度,它包含部件陣列的 的數量。 長度可能爲正值或爲零

來源:JLS §10.7

正如mprivat提到的,如果你曾經嘗試創建大小爲負的數組,一個NegativeArraySizeException將被拋出。

+0

那麼爲什麼要檢查它(<0)? – Reimeus 2012-07-17 20:09:16

+4

@Reimeus給予好人們一些討論。 – 2012-07-17 20:10:01

+9

@Reimeus:因爲程序員從不犯任何錯誤,並且始終寫出最優化的代碼。 – tskuzzy 2012-07-17 20:10:18

6

我不相信這是可能的。即使通過反思,它也被視爲NegativeArraySizeException。

+0

我努力改變數組的長度,但發現自己無法這樣做。 'getDeclaredFields()'方法返回一個數組輸入的空結果,'Array'反射類可以理解地沒有這樣的方法(因爲你爲什麼要這樣做?)我認爲沒有直接修改內存就沒有這樣做的方式,但我懷疑實際上有一個檢查會阻止這一點。當然,如果一個程序正在修改你的內存,那麼你的問題會比參數檢查更大...... – corsiKa 2012-07-18 14:35:02

+0

是的,我認爲那只是錯誤的代碼。唯一能做到的就是以某種方式修改字節碼。坦率地說,即使如此,如果長度以某種方式編碼爲無符號數(我懷疑是這種情況),我並不是100%確定。 – mprivat 2012-07-18 15:11:01

+0

我不這麼認爲,因爲你不能編譯int [] a = new int [3000000000];' - 我懷疑它像其他任何存儲爲int一樣。 – corsiKa 2012-07-18 16:04:08

0

這只是一個異常處理問題。你可以在Java中創建一個負數大小的數組 - 它在編譯時甚至不會拋出異常。但在運行時,您的程序將無法運行,直到更正爲止。 (它會拋出一個NegativeArraySizeException。)

問題是在運行時引發此異常而不是編譯時 - 這就是爲什麼異常已被IllegalArgumentException處理。

+0

好,但需要一些更多的解釋.. – Shivaay 2013-08-21 17:50:03

+0

「*您可以在Java *中創建一個負數大小的數組。」 - 否,您不是。你可以寫*新的int [-1],但JVM不會創建這樣的數組。 Java數組對象永遠不會有負數長度。 – dimo414 2016-11-24 07:09:11