Forum: PC-Programmierung Finde den Fehler (bitte)


von Wühlhase (Gast)


Lesenswert?

Mahlzeit

Ich sitze hier vor einem Javaprogram und sehe den Grund für die ständig 
kommende Exception nicht.
Es geht darum, zwei Arrays zu einem neuen Array zu verbinden.
1
DataFrame = new byte[FrameHeader.length + Data.length -2];
2
//Daten aus FrameHeader in DataFrame kopieren (1-4)            System.arraycopy(FrameHeader, 0, DataFrame, 0, FrameHeader.length -1);
3
//Daten aus Data in DataFrame kopieren (5-Data.Lenght)            System.arraycopy(Data, 0, DataFrame, FrameHeader.length, DataFrame.length -1);

Erst soll das Array 'FrameHeader' vorne reinkopiert werden, im Anschluß 
soll 'Data' dahinter reinkopiert werden. Warum kopiert Java das erste 
Array, aber ds zweite nicht und schmeißt dafür eine 
ArrayIndexOutOfBoundsException?

Sieht irgendjemand etwas, was ich nicht sehe?

von Wühlhase (Gast)


Lesenswert?

Code nochmal vernünftig formatiert:
1
DataFrame = new byte[FrameHeader.length + Data.length -2];
2
//Daten aus FrameHeader in DataFrame kopieren
3
System.arraycopy(FrameHeader, 0, DataFrame, 0, FrameHeader.length -1);
4
//Daten aus Data in DataFrame kopieren
5
System.arraycopy(Data, 0, DataFrame, FrameHeader.length, DataFrame.length -1);

von K. S. (hagbart06)


Lesenswert?

1
System.arraycopy(Data, 0, DataFrame, FrameHeader.length-1, DataFrame.length -1);

: Bearbeitet durch User
von Der Andere (Gast)


Lesenswert?

1.
Reduziere den Code bis auf einen den man einfach ausführen kann. So 
sieht man z.B. nicht die Definition der Arrays die du zusammenkopieren 
willst.
2.
Du schreibst zwar ArrayIndexOutOfBounds Exception, aber warum kopierst 
du nicht den kompletten fehler hier rein?

3. Warum hat das neue Arraydie Länge Array1 + Array2 - 2
Was soll die Minus 2?

Denke darüber mal nach

Nutze den Debugger, mache dir ein einfaches Beispiel mit zwei Array aus 
z.B. nur 4 und 5 Bytes und schaue was rauskommt. Dann kannst du den 
Fehler problemlos selbst finden.

von zyxw (Gast)


Lesenswert?

Prüfe doch mal, ob die Größe des Zielarrays wirklich ausreicht.

von K. S. (hagbart06)


Lesenswert?

Der Andere schrieb:
> Was soll die Minus 2?

Berechtigter Einwand, bin automatisch davon ausgegangen, dass er das 
jeweils letzte Element nicht mit kopieren möchte. Da er davon aber 
nichts schrieb, gehe ich davon aus, dass der ihm der Unterschied 
zwischen Anzahl der Elemente und Index nicht klar ist...

von Wühlhase (Gast)


Lesenswert?

Danke für die Hinweise-nein, die -2 gehören da wirklich nicht rein. Es 
macht aber keinen Unterschied, ohne funktioniert es auch nicht. Das 
DataFrame-Array ist auch lang genug.

FrameHeader.length = 4
Data.length = 2055
DataFrame.legth = 2059

von Wühlhase (Gast)


Lesenswert?

Oh man...wie auch immer, es funktioniert jetzt.

von c.m. (Gast)


Lesenswert?

Wühlhase schrieb:
> ArrayIndexOutOfBoundsException

wird nur geworfen wenn das zielarray zu klein ist, du also versuchst 
über das ende hinaus zu schreiben.
vielleicht magst du diese lösung:
1
public class JavaApplication3 {
2
3
    public static void main(String[] args) {
4
        byte[] arr1 = {'a', 'b', 'c'};
5
        byte[] arr2 = {'A', 'B', 'C', 'D'};
6
        byte[] target = null;
7
        ByteArrayOutputStream baos = new ByteArrayOutputStream(arr1.length + arr2.length); // initiallänge optional
8
        try {
9
            baos.write(arr1);
10
            baos.write(arr2);
11
            target = baos.toByteArray();
12
        } catch (IOException ex) {
13
            Logger.getLogger(JavaApplication3.class.getName()).log(Level.SEVERE, null, ex);
14
            System.exit(1);
15
        } finally {
16
            if (null == target) {
17
                System.out.println("kacke");
18
            } else {
19
                System.out.println("len: " + target.length);
20
                System.out.println("inh: " + new String(target));
21
            }
22
        }
23
    }
24
}

out:
1
run:
2
len: 7
3
inh: abcABCD
4
BUILD SUCCESSFUL (total time: 0 seconds)

von Wühlhase (Gast)


Lesenswert?

Wie gesagt-jetzt läuft es.

Delete complete...

Aber trotzdem vielen Dank. Das nächste Problem kommt bestimmt. ;)

von Eric B. (beric)


Lesenswert?

Wühlhase schrieb:
> Oh man...wie auch immer, es funktioniert jetzt.

Und ist dir klar warum es jetzt funktioniert und zuvor nicht?
Sonst kommt nicht das nächste Problem, sondern das gleiche nochmal.

von Bernd B. (Gast)


Lesenswert?

Der Knackpunk dürfte wohl sein, dass es in der letzten Zeile Data.length 
anstatt DataFrame.length heißen muss, sonst ist der Überlauf garantiert.

von Bernd B. (Gast)


Lesenswert?

Knackpunkt :)

von Erwin D. (Gast)


Lesenswert?

Bernd B. schrieb:
> Knackpunkt :)

Immer noch besser, als wenn du den zweiten Buchstaben vergessen 
hättest...
:-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.