Hallo, ich habe hier ein mehr oder weniger großes Problem Immer wenn ich versuche den Code auszuführen erhalte ich einen Fehler, die Fehlernachricht lautet: Der Index war außerhalb des Arraybereichs. Da ich mich mit Arrays nicht so gut Auskenne weis ich nicht was damit gemeint ist oder wie ich das Problem lösen kann. Ich erwarte nicht das ihr das Problem für mich lösen sollt es würde mir schon vollkommen ausreichen wenn es mir jemand Erklären könnte falls jemand genug zeit hat wäre es für mich natürlich kein Problem wenn er mir noch gleich sagt wie ich den Fehler beheben kann. Hier nochmal der SQL code falls man es in den Bildern nicht genau sehen kann: insert into smartcontrol.attributeflags (flagvalue,FK_ID_attributename,FK_harddisk,FK_user) values ('FLAG', 'ID', 'PK_harddisk', 'user');
Der Fehler bedeutet: du hast ein Array (also eine Folge von Werten in einem bestimmten Bereich), und versuchst auf ein Element zuzugreifen, das gar nicht im Feld liegt, sondern außerhalb liegen würde. Wenn du also z.B. ein Feld mit 3 Elementen hast an den Stellen [0], [1] und [2], und versuchst auf das Element an der Stelle [-1] oder [5] zuzugreifen, bekommst du eine solche Meldung. Wenn ich das letzte Bild anschaue, ist es vielleicht das Ding, das auch array heißt. Es wird von line.split() gefüllt. Jetzt wäre interessant, ob da überhaupt genug Elemente zurückkommen, um array[0] und array[2] anfassen zu können. Wie sieht denn line aus? Und wieviele Elemente kommen aus dem line.split()? So etwas sollte man in einem Programm abprüfen, wenn man nicht absolut sicher ist daß es passt - was hier wohl nicht der Fall ist.
... übrigens: ein echt aussagefähiger Topic Title. Respekt...
Thilo L. schrieb: > ... übrigens: ein echt aussagefähiger Topic Title. Respekt... ...und das Beste daran ist, der Titel klingt nicht nur super spannend, sondern er macht auch sofort neugierig. 😯
Jonas N. schrieb: > Okay und wie überprüfe ich das? Das kann ich dir nicht sagen, weil ich deine Umgebung nicht kenne. Ist wohl irgendwas mit Datenbanken, und das hier ist ein Mikrocontrollerforum. Aber es wird schon die Möglichkeit geben mit etwas wie if( array.size()<3 ) { MessageBox( "oh, zu kurz heute" )... Erst wenn das überstanden ist, macht es Sinn auf array[2] zuzugreifen. Gibt es zu deiner Umgebung irgendeine Doku, wo so etwas drin stehen könnte?
Ich würd mal den Try/Catch block deaktivieren und den Debugger mitlaufen lassen. Damit du tatsächlich sehen kannst, an welcher Stelle es genau hakt..
Du nutzt ein INSERT mit der MysqlDataReader-Klasse, welche dazu gedacht ist, Daten aus der Datenbank zu lesen. Ich vermute daher, dass ExecuteReader die Exception wirft, die dich in den Catch-Block befördert – einfach mal debuggen. Als Abhilfe sollte es ja auch sinngemäß einen Writer geben; kann ich gerade nicht nachsehen.
Jonas N. schrieb: > Hallo, ich habe hier ein mehr oder weniger großes Problem [...] > wie ich den Fehler beheben kann. Viele Worte, wenig Information... und ein paar strategisch gesetzte Satzzeichen verbessern die Lesbarkeit eines Textes erheblich. > Hier nochmal der SQL code falls man es in den Bildern nicht genau sehen > kann: insert into smartcontrol.attributeflags > (flagvalue,FK_ID_attributename,FK_harddisk,FK_user) values ('FLAG', > 'ID', 'PK_harddisk', 'user'); Was ist eigentlich ein Fremdschlüssel (Foreign Key)? Was für Datentypen haben Deine Fremdschlüssel, und welchen Datentyp haben die Daten, die Du dort eintragen willst?
Fehlermeldungen sind verbal nicht immer absolut korrekt. Eine mögliche Ursache ist, dass du im Code (letzter Screenshot) nach dem Ausführen des SQl sofort ans Auslesen von myReader (Zeile 570) gehst, ohne zu prüfen, ob es überhaupt ein Resultat gibt. Wenn der nämlich null ist, schlägt m.E. das read fehl. Es kommt also erst garnicht zu true oder false ... Check mal vorher mit: if(myReader !=null){ while ... }} else {System.out.println("war nix");} Was mir noch aufgefallen ist: Im zweiten Screenshot sehen die Daten im Feld "flagvalue" in der zweiten Zeile komisch aus. Sollte das Feld den Typ "date" haben, könnte das evtl. ein Grund für schwer nachvollziehbare Fehlermeldungen sein ... Wobei sich dann allerdings auch die Frage stellt, wie ist das dort reingekommen? Bereits in dem Moment hätte es eine Fehlermeldung geben müssen.
:
Bearbeitet durch User
Jonas N. schrieb: > er Index war außerhalb des Arraybereichs. Da > ich mich mit Arrays nicht so gut Auskenne weis ich nicht was damit > gemeint ist oder wie ich das Problem lösen kann. Ich habe mir deinen Code nicht angesehen, aber ich habe eine Ahnung. Beispiel: Du hast ein Array von 10 Feldern. Dann musst du das SO Ansprechen. For i = 0 to 10 my_arry(i) = "bla" next i Einfach gesagt. Ein Arry fängt i.d.R. IMMER bei 0 an und hört mit Arrygrösse -1 auf. Wenn du das my_arry(10) ansprichst dann bist du außerhalb des Bereich der ja wie gesagt von 0 bis 9 geht. Das ist Standartfehler Nr. 1 . Passiert selbst mir nach über 30 Jahren noch manchmal ;)
Schlaumaier schrieb: > Du hast ein Array von 10 Feldern. > > Dann musst du das SO Ansprechen. > > For i = 0 to 10 > my_arry(i) = "bla" > next i > > Einfach gesagt. Ein Arry fängt i.d.R. IMMER bei 0 an und hört mit > Arrygrösse -1 auf. > > Wenn du das my_arry(10) ansprichst dann bist du außerhalb des Bereich > der ja wie gesagt von 0 bis 9 geht. > > Das ist Standartfehler Nr. 1 . Passiert selbst mir nach über 30 Jahren > noch manchmal ;) Nicht nur manchmal! Das hast du ja mit deinem Beispiel oben gleich wieder bewiesen.
Da gibt es einige Dinge, die Du mal überarbeiten bzw. absichern solltest. Anfangen würde ich mit dem Lesen und Verarbeiten Deiner Textdatei mit den Plattendaten. Du liest die Datei zeilenweise ein, splittest jede Zeile und gehst stumpf davon aus, dass sich dann im Feld 0 eine ID befindet und in Feld 2 ein Flag. aber schau Dir doch mal die Datei an... da sind erstmal jede Menge Kopfzeilen mit irgendwelchem Text, dann gibt es leere Zeilen und möglichweise hast du am Ende auch noch einen Zeilenumbruch, den Du beachten musst. Hier sollte mindestens folgendes gemacht werden: 1) Das aus split() resultierende Array muss auf die Anzahl seiner Elemente hin untersucht werden. Wieviele Elemente erwartest Du? Wieviele Elemente hast Du tatsächlich? Erst dann gehts weiter... 2) Wenn die Länge des Arrays stimmt, solltest Du prüfen, ob in den Feldern, die Du weiter verarbeitest, auch die Werte plausibel sind. Dazu nimmt man typischerweise reguläre Ausdrücke. Aber auch das simple prüfen der Länge wäre schonmal ein Fortschritt. 3) So schreibt man nicht in eine Datenbank. Benutze cmdDataBase.ExecuteNonQuery(); statt executeReader(); Abgesehen davon setzt man die SQL Query nicht einfach so aus Variablen zusammen. Verwende Platzhalter und übergebe die Werte als Parameter.
Schlampe schrieb: > Nicht nur manchmal! Das hast du ja mit deinem Beispiel oben gleich > wieder bewiesen. muss ich dir sogar recht geben. ;) Liege aber daran das ich immer 1-10 mache und die Dimensionierung dem entsprechend setzte.
Schlampe schrieb: > Schlaumaier schrieb: > >> Du hast ein Array von 10 Feldern. >> >> Dann musst du das SO Ansprechen. >> >> For i = 0 to 10 >> my_arry(i) = "bla" >> next i >> >> Einfach gesagt. Ein Arry fängt i.d.R. IMMER bei 0 an und hört mit >> Arrygrösse -1 auf. >> >> Wenn du das my_arry(10) ansprichst dann bist du außerhalb des Bereich >> der ja wie gesagt von 0 bis 9 geht. >> >> Das ist Standartfehler Nr. 1 . Passiert selbst mir nach über 30 Jahren >> noch manchmal ;) > > Nicht nur manchmal! Das hast du ja mit deinem Beispiel oben gleich > wieder bewiesen. Das war nur für diejenigen gedacht die Mitdenken.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.