2012-07-17 24 views
24

Onlar bir çıkış akışı oluşturarak edildi bir açık kaynak projesi geçiyor ve aşağıdaki yöntemle karşıdan karşıya geldi:Java dizi uzunluğu 0'dan az mı?

@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)); 
    } 
} 

Yani byte[] buffer sadece normal eski byte[] olduğunu. Bunun boş olmadığını biliyoruz. 0'dan küçük bir uzunluğa sahip olmak bile mümkün mü? Gibi, yansıma yansıması ile yapılabilir mi?

+0

Ne demek "biz null değil" biliyoruz? –

+3

@EdwardThomson: İlk ifadenin arabellek == null ' –

+0

olduğunu düşünüyorum. Belki bu projede başka bir yer' -1 'bir dizinin geçersiz olduğunu veya böyle bir şey olduğunu söylemek için geçerli bir kuraldır. işte sonunda bir istisna haline geldi. – thalador

cevap

29

Hayır ile korunur, bu hiçbir zaman gerçekleşemez. Uzunluğun, Java teknik özelliklerine göre negatif olmadığı garanti edilir. Bir dizi Çeşidi

üye aşağıdakilerin hepsi:

  • bileşenleri dizisinin sayısını içeren ortak nihai alan uzunluğu. uzunluğu pozitif veya sıfır olabilir.

Kaynak: mprivat belirtildiği gibi Hiç olumsuz boyutta bir dizi oluşturmaya çalışırsanız JLS §10.7

, bir NegativeArraySizeException atılacaktır.

+0

Öyleyse neden kontrol et (<0)? – Reimeus

+4

@Reimeus İyi insanlara SO'yu tartışacak bir şey vermek. –

+9

@Reimeus: Programcılar hiçbir zaman hata yapmıyor ve her zaman en uygun kodu yazıyor. – tskuzzy

6

Bunun mümkün olduğuna inanmıyorum. Yansıma yoluyla bile NegativeArraySizeException

+0

olduğunu kontrol edin. Dizinin uzunluğunu yansıtıcı bir şekilde değiştirmek için çaba harcadım, ancak bunu yapamadığımı fark ettim. "GetDeclaredFields()" yöntemi bir dizi giriş için boş bir sonuç döndürür ve "Array" yansıma sınıfının anlaşılabilir bir şekilde böyle bir yöntemi yoktur (çünkü neden bunu istediğinizi tercih edersiniz?). Bunu yapmanın yolu, ama aslında bunu engelleyecek bir kontrol olduğundan şüpheliyim. Tabii ki, bir program size bellek değiştiriyorsa, bir parametre kontrolü ile yakalayabileceğinizden daha büyük sorunlarınız var ... – corsiKa

+0

Evet, bu sadece kötü bir kod olduğunu düşünüyorum. Bunu gerçekleştiren tek şey, bir şekilde bayt kodunda değişiklik yapmaktı. Ve açıkçası, bununla bile, eğer bir şekilde imzasız bir sayı olarak kodlanmışsa (ki durumdan şüpheleniyorum)% 100 emin değilim. – mprivat

+0

Bunun olduğunu sanmıyorum çünkü 'int [] a = new int [3000000000]' yi derleyemezsiniz; – corsiKa

0

Bu yalnızca bir özel durum işleme sorunudur. Java'da negatif bir boyuta sahip bir dizi oluşturma izniniz vardır - derlediğinizde bir istisna bile atmaz. Ama çalışma zamanında, programınız düzeltilene kadar çalışmayacaktır. (Bir NegativeArraySizeException atacaktır.)

Sorun, derleme zamanı yerine çalışma zamanında atılan bu istisnadır - Bu nedenle istisna IllegalArgumentException ile işlenmiştir.

+0

İyi ama biraz daha fazla açıklamaya ihtiyacımız var .. – Shivaay

+0

"* Java'da negatif boyutta bir dizi oluşturmanıza izin veriliyor *" - hayır, değilsiniz. * * * New int [-1] 'yazabilirsiniz, ancak JVM böyle bir dizi oluşturmayacak. Hiçbir Java dizi nesnesinin negatif uzunluğu olmaz. – dimo414