Forum: PC-Programmierung Hallo, benötige Hilfe bei meinem Projekt


von Jonas N. (medustv)



Lesenswert?

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');

von Klaus W. (mfgkw)


Lesenswert?

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.

von Jonas N. (medustv)


Lesenswert?

Okay und wie überprüfe ich das?

von Thilo L. (bc107)


Lesenswert?

... übrigens: ein echt aussagefähiger Topic Title. Respekt...

von MaWin 2 (Gast)


Lesenswert?

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. 😯

von Klaus W. (mfgkw)


Lesenswert?

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?

von byteschubser (Gast)


Lesenswert?

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..

von Horst G. (horst_g532)


Lesenswert?

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.

von Nur_ein_Typ (Gast)


Lesenswert?

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?

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

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
von Schlaumaier (Gast)


Lesenswert?

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

von Schlampe (Gast)


Lesenswert?

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.

von Mikel (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von Fragezeichen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.