2016-08-14 1 views
-1

Im Code erzeuge ich ein Array von Bytes aus 2 ganzen Zahlen mit Byte-Puffer. Wenn ich versuche, das Array in einen Ausgabestream zu schreiben, erhalte ich eine ArrayIndexOutOfBounds-Ausnahme. Der length-Parameter für die Methode write (array, offset, length) in OutputSteam geht davon aus, dass das Array kleiner ist als die Array-Länge, selbst wenn ich die Eigenschaft vom Array selbst überlasse. Ich habe überprüft, dass die Datei groß genug ist, indem ich Dummy-Daten schreibe, aber ich bekomme immer noch dieselbe Ausnahme.Byte-Array-Länge nicht korrekt

OutputStream out = new FileOutputStream("File"); 
ByteBuffer buff = ByteBuffer.alocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 

out.write(array, 0, array.length); // Heres where the problem comes in 
+0

was ist Ihr Offset? –

+3

Dieser Code ist nicht gültig Java. Wenn Sie Hilfe benötigen, müssen Sie den _actual_ Java-Code posten, der fehlschlägt, nicht Ihre Paraphrasierung davon. Veröffentlichen Sie auch den Stack-Trace und geben Sie die Werte von Variablen wie "Offset" an. –

+0

Nein, das Problem kommt früher als die Zeile mit dem Kommentar. Momentan ist es die Tatsache, dass Sie Code veröffentlichen, der nicht einmal kompiliert wird. – GhostCat

Antwort

1

Nun, ein arrray hat N Objekte, und die letzte Aufgabe wird durch N-1 indiziert, da es sich bei 0. Array.length beginnt, ist N, und Sie wollen, N-1.

+0

Dieser 'write' Aufruf ist absolut gültig:' element b [off] ist das erste geschriebene Byte und b [off + len-1] ist das letzte von dieser Operation geschriebene Byte. –

+0

Ich habe es versucht, keine Freude, auch nicht nach subtrahieren mehr als die Hälfte – Honin

+0

In diesem Fall habe ich keine Ahnung. Ich denke, es könnte ein Problem mit sich selbst sein. Der beste Weg, um Probleme zu lösen, ist meiner Erfahrung nach entweder Fehler zu hören oder mehr Details online zu veröffentlichen. – Darkrifts

0

Da array.length Ihnen Anzahl der Bytes gibt, möchten Sie Integer.BYTES (Bytes pro Integer) nicht Integer.SIZE (Bits pro Integer) verwenden, wenn Sie für den Puffer reservieren.

ByteBuffer buff = ByteBuffer.allocate(Integer.BYTES*2); 
buff.putInt(18); 
buff.putInt(32); 
byte[] array = buff.array(); 
+0

Dies führt immer noch zu einer IndexOutOfBounds-Ausnahme beim Schreiben in den Ausgabestream – Honin