Compiler-Fehler Entschlüsselung

X

xyzjava

Gast
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12
at main.entschluesseln(main.java:2) <- angepasst auf diesen code-snippet

bei
Java:
for (int i1 = 0; i1<z.length; i1++) {
       	   pos[i] = z[i];
		      for (int j = 0; j < v.length(); j++) {
		    	  if ( ( pos[i]+i*lo )<vTl.length){
	                    r = r+vTl[pos[i]+i*lo];
	              }
				
			}
       	   }

Bin gerade zu blöd den fehler zu finden, geht nur um das erste for und der ersten anweisung dadrin erst mal
 
Zuletzt bearbeitet von einem Moderator:
B

bone2

Gast
die äußere schleife nutzt
Code:
i1
um werte aus z holen nutzt du plötzlich
Code:
i
 
N

nillehammer

Gast
Das Array pos ist wohl zu klein. Deswegen fliegt die Exception bei der Zuweisung
Java:
pos[i] = z[i];
[EDIT]Stimmt, das mit dem i und i1 könnte auch sein. Hab ich garnicht bemerkt. Da siehst Du mal, wie wichtig lesbarer Code ist! ;)[/EDIT]
 
X

xyzjava

Gast
Ändert sich nichts wenn ich index i1 verwende.

Wie kann ich das dem Array aber anpassen?
das ist wichtig, weil die Größe des Arrays wird durch eine Länge eines eingebenen String bestimmt, sollte dynamisch sein
 
X

xyzjava

Gast
dürfen wir aber nicht, wir sollen kein ArrayList verwenden.
Prof meinte das geht schon

aber der fehler taucht jetzt hier auf:

Java:
if ( ( pos[i]+i*lo )<vTl.length){
                        r = r+vTl[pos[i]+i*lo];
         }
Läuft drüber heraus mit 12, Index steht aber nur von 0 bis 11
 

maestr0

Bekanntes Mitglied
Löst das dein Problem?

Java:
if ( ( pos[i1]+i1*lo )<vTl.length){
                        r = r+vTl[pos[i1]+i1*lo];
         }
 
S

SlaterB

Gast
du postest unvollständigen Code, aus dem nicht erkennbar ist, welchen Wert i hat,
i ist jedenfalls nicht i1, welches von 0-11 läuft

die Java Virtual Machiner, die in den letzten 30 Jahren zuverlässig wer weiß wieviele Programme wer weiß wie oft überwiegend korrekt ausgeführt hat und dabei auch Unmengen falsche Array-Zugriffe richtig angezeigt hat,
sagt dir nun dass der Index zu groß ist,

was ist nun also anzunehmen, dass du in deinem recht fragwürdigen Programm doch den Durchblick hast und dein i korrekt gesetzt ist und die große JVM einen Fehler begangen hat,
oder liegt der Fehler nicht doch viel eher bei dir?

wenn du schon selber zu letzterem gekommen bist, du also weißt dass dein i doch 12 ist, durchaus aber nicht warum
was bezweckst du dann mit deinem Posting?
poste doch wenigstens mehr Code damit man erkennen kann wo i definiert wird und welche Werte es bekommt,
um dann dir zu sagen warum irgendwann 12 drin steht
 
X

xyzjava

Gast
Jop, macht zwar noch immer was falsch... aber ich glaube das liegt jetzt an mir...

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrddddddddddddddddddddddddddddddddddddddddddddddlllllllllllllllll
das soll er eben nicht machen sondern

rdl
 
X

xyzjava

Gast
Bei mir selber hab ich ja aussagekräftigere:

Java:
for (int i = 0; i < verTeil.length; i++) {
    	   int pos [] = new int[zahlenlosung.length];
       	   for (int i1 = 0; i1<zahlenlosung.length; i1++) {
       	   pos[i1] = zahlenlosung[i1];
		   for (int j = 0; j < verschtext.length(); j++) {
		    	  if ( ( pos[i1]+i*laengeLosung )<verTeil.length){
	                    rückgabe = rückgabe+verTeil[pos[i1]+i*laengeLosung];
				   
	              }
		   }
       	   }
       }
 
N

nillehammer

Gast
xyzjava hat gesagt.:
Wie kann ich das dem Array aber anpassen?
das ist wichtig, weil die Größe des Arrays wird durch eine Länge eines eingebenen String bestimmt, sollte dynamisch sein
Arrays sind nicht dynamisch. Müssen Sie für Deinen Anwendungsfall aber höchswahrscheinlich auch garnicht sein. Du musst beim initialisieren des Arrays halt irgendwie intelligent die benötigte Größe kennen. Wenn die Größe des Arrays durch die Länge eines eingegebenen Strings bestimmt wird, dann geht z.B. folgendes:
Java:
String eingegebenerString = ...wo auch immer der herkommt...
int[] pos = new int[eingegebenerString.length];
Ich glaube auch nicht, dass eine dreifach verschachtelte for-Schleife plus dem if (also vier! Verschachtelungsebenen) für Dich leicht zu managen sind. Das ist sogar für erfahrene Programmierer zu schwer. Und deswegen machen die sowas auch nicht. Denk Dir einen sprechenden Namen für das aus, was in jeder einzelnen for-Schleife passiert und lager jede einzelne for-Schleife in eine Methode mit dem entspr. Namen aus und lass sie sich gegenseitig aufrufen. Dann kannst du die Methoden auch einzeln testen und findest Deinen Fehler auch schneller.
 
X

xyzjava

Gast
Hab mir ja notiert hier was sie machen sollen

problem ist halt das ganze muss entschlüsseln.
gegeben wird ein Verschlüsselter Text und ein Codewort, und das soll über den Übichi entschlüsselt werdren, wir haben ahlt null Hilfe oder Informationen bekommen darüber...
 
S

SlaterB

Gast
ist aktuell eine Frage offen?
wenn es inhaltlich um noch nicht fertige Ver-/Entschlüsselung geht, musst du wohl etwas weiter ausholen,
Beispiele helfen auch

im geposteten Code ist das pos[] im Moment recht fragwürdig, es wird an jeden Index genau das Element aus dem zahlenlosung-Array geschrieben,
welches zwischendurch nicht geändert wird, wieso nicht pos weglassen und direkt mit zahlenlosung[i1] arbeiten?
 

Landei

Top Contributor
Bei mir selber hab ich ja aussagekräftigere:

Java:
for (int i = 0; i < verTeil.length; i++) {
    	   int pos [] = new int[zahlenlosung.length];
       	   for (int i1 = 0; i1<zahlenlosung.length; i1++) {
       	   pos[i1] = zahlenlosung[i1];
		   for (int j = 0; j < verschtext.length(); j++) {
		    	  if ( ( pos[i1]+i*laengeLosung )<verTeil.length){
	                    rückgabe = rückgabe+verTeil[pos[i1]+i*laengeLosung];
				   
	              }
		   }
       	   }
       }

Damit legst du in jedem äußeren Schleifendurchlauf ein neues Array pos an. Willst du das?
 

AquaBall

Top Contributor
Bei mir selber hab ich ja aussagekräftigere:

Java:
for (int i = 0; i < verTeil.length; i++) {
    	   int pos [] = new int[zahlenlosung.length];
       	   for (int i1 = 0; i1<zahlenlosung.length; i1++) {
       	   pos[i1] = zahlenlosung[i1];
		   for (int j = 0; j < verschtext.length(); j++) {
		    	  if ( ( pos[i1]+i*laengeLosung )<verTeil.length){
	                    rückgabe = rückgabe+verTeil[pos[i1]+i*laengeLosung];
				   
	              }
		   }
       	   }
       }

Aber immer noch
Code:
"i"
und
Code:
"i1"
und dann noch ein
Code:
"j"
!
Da kann man auch
Code:
"keyIdx"
und
Code:
"textIdx"
(oder was es auch immer sein soll) nehmen.
daran wird das Programm mich gesunden, aber es fällt einfacher eine Diagnose zu stellen.

Es ist mal uralte Norm in Basic gewesen Integerzahlen mit I,J,K... und Realzahlen mit R,S,T,U... zu benennen.
Aus Platzgründen waren sie auch nur 1 Buchstaben lang.
Aber beides ist längst nicht mehr nötig und nicht mehr sinvoll und -> FÜHRT ZU FEHLERN.

Und zudem ist das ganze sehr verschachtelt, falsch eingerückt, und unmöglich formatiert.

Wie wärs mit, vielleicht tust du dich damit auch leichter:
(Geht ja in Eclipse mit ShiftAlt-R und ShiftCtrl-F hervorragend bequem.)
Dann erkennst du auch, dass dein pos[] gar keinen Zweck erfüllt. Da reicht eine einfache Int.
Java:
for (int teilIdx = 0; teilIdx < verTeil.length; teilIdx++) {
	int pos[] = new int[zahlenlosung.length];
	for (int losungIdx = 0; losungIdx < zahlenlosung.length; losungIdx++) {
		pos[losungIdx] = zahlenlosung[losungIdx];
		for (int keyIdx = 0; keyIdx < verschtext.length(); keyIdx++) {
			int posTeilLaenge = pos[losungIdx] + teilIdx * laengeLosung;
			if (posTeilLaenge < verTeil.length) {
				rückgabe = rückgabe + verTeil[posTeilLaenge];
			}
		}
	}
}

Edit: Aha, ist auch schon jemand anderem aufgefallen.
Folgendes macht exakt das selbe:
Java:
for (int teilIdx = 0; teilIdx < verTeil.length; teilIdx++) {
	for (int losungIdx = 0; losungIdx < zahlenlosung.length; losungIdx++) {
		for (int keyIdx = 0; keyIdx < verschtext.length(); keyIdx++) {
			int posTeilLaenge = zahlenlosung[losungIdx] + teilIdx * laengeLosung;
			if (posTeilLaenge < verTeil.length) {
				rückgabe = rückgabe + verTeil[posTeilLaenge];
			}
		}
	}
}
 
Zuletzt bearbeitet:

Ähnliche Java Themen

Neue Themen


Oben