mikrocontroller.net

Forum: PC-Programmierung Finde den Fehler (bitte)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Wühlhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
DataFrame = new byte[FrameHeader.length + Data.length -2];
//Daten aus FrameHeader in DataFrame kopieren (1-4)            System.arraycopy(FrameHeader, 0, DataFrame, 0, FrameHeader.length -1);
//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?

Autor: Wühlhase (Gast)
Datum:

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

Autor: Kevin S. (hagbart06)
Datum:

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

: Bearbeitet durch User
Autor: Der Andere (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: zyxw (Gast)
Datum:

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

Autor: Kevin S. (hagbart06)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Wühlhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wühlhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man...wie auch immer, es funktioniert jetzt.

Autor: c.m. (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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:
public class JavaApplication3 {

    public static void main(String[] args) {
        byte[] arr1 = {'a', 'b', 'c'};
        byte[] arr2 = {'A', 'B', 'C', 'D'};
        byte[] target = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream(arr1.length + arr2.length); // initiallänge optional
        try {
            baos.write(arr1);
            baos.write(arr2);
            target = baos.toByteArray();
        } catch (IOException ex) {
            Logger.getLogger(JavaApplication3.class.getName()).log(Level.SEVERE, null, ex);
            System.exit(1);
        } finally {
            if (null == target) {
                System.out.println("kacke");
            } else {
                System.out.println("len: " + target.length);
                System.out.println("inh: " + new String(target));
            }
        }
    }
}

out:
run:
len: 7
inh: abcABCD
BUILD SUCCESSFUL (total time: 0 seconds)

Autor: Wühlhase (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gesagt-jetzt läuft es.

Delete complete...

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

Autor: Eric B. (beric)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd B. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Knackpunkt :)

Autor: Erwin D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd B. schrieb:
> Knackpunkt :)

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.