ArrayIndexOutOfBoundsException

Status
Nicht offen für weitere Antworten.

NataLi

Mitglied
Hallo Leute,
mein Programm liest aus einer Datei die Entfernungsmatrix ein.
Dann sollen nach einer Formel die Werte aus dieser Matrix einer Variable(bla9) zugewiesen werden und ausgegeben.
Aber mittendrin bricht das Programm ab...
Und ich weiss nicht warum.
Hat jemand eine Idee?
Code:
import java.util.Scanner;
import java.io.*;
import java.util.*;


class Savings {
	public static void main(String [] args)throws IOException {
		
	int tourlength = 0;
	int loadingcapacity=0;
	int j=0;
	String line;
	

	//count number of places in list
	Scanner readplaces = new Scanner(new File("Eingabe2.txt"));	
	int nplaces=-2;
	while (readplaces.hasNextLine()){
		line=readplaces.nextLine(); nplaces++;
	}
	String [] [] tours = new String [nplaces][(nplaces+1)];
	
	//Entfernungsmatrix, ausgehend aus der String Matrix
	int [][] array = new int[nplaces][nplaces+1];
	readplaces.close();
	
	
	//read max tourlength and max loadingcapacity from txt file
	Scanner read = new Scanner(new File("Eingabe2.txt"));	

	tourlength = Integer.parseInt(read.nextLine());
	loadingcapacity = Integer.parseInt(read.nextLine());
	System.out.println("max tourlength: "+tourlength);
	System.out.println("max loadingcapacity: "+loadingcapacity+"\n");
	
	//read tourinformation from next lines
	while (read.hasNextLine()){
		line = read.nextLine();
		String [] sline = line.split(",");
		for(int i=1; i<sline.length;i++) {
			if (i==1) {	tours[j][(i-1)] = sline[i];array[j][(i-1)]=Integer.valueOf(sline[i]);}
			else	{tours[j][(i-1+j)] = sline[i];array[j][(i-1+j)]=Integer.valueOf(sline[i]);}
		}
	j++;
	}
	
	//print out matrix
	System.out.print("Ort\tMenge");
	for(int i=2;i<=nplaces;i++){
		System.out.print("\tDist"+i);
	}
	
	// Ausgabe der Entfertungsmatrix ( als Integer), die wir eingelesen haben.
	
	System.out.print("\tDepot\n\n");
		
	for (int i=0; i < array.length; i++){
		System.out.print("Ort"+(i+1)+"\t");
			for (int k=0; k < array[0].length; k++){
			if (array[i][k]==0) {System.out.print("-\t");}
			else {System.out.print(array[i][k]+"\t");}
			}		
			System.out.println("");	}
		
	ArrayList <Integer> liste = new ArrayList<Integer>();	

	//Berechung des Savings
	
		int l=0;
		int v=1;
		for(int k=0;k<(array.length-1);k++){	
		for(int d=0;d<(array.length-2);d++){
		int bla9= array[l][array.length]+array[v][array.length]-array[l][v];
		
		v++;
		
		System.out.print(bla9+"\t");}
		System.out.println();
		l++;v=l+1;
	  }			
	}
}
Und hier ist die einzulesene Textdatei:
Code:
200
10
a,3,60,48,32,25,15,10,40
b,4,48,35,25,26,16,35
c,2,30,32,31,23,28
d,5,26,38,29,25
e,4,32,26,10
f,4,34,10
g,5,25
 
> Hat jemand eine Idee?

es liegt an der Exception,
schau sie dir genauer an, nenne vor allem die Zeilennummer usw

analysiere die entsprechende Zeile, welche Arrays werden bearbeitet, wie lang sind sie?
was sind die aktuellen Indexe wie i, j usw. (System.out.println() oder Debugger)?

du wirst sehen, dass irgendein Index zu groß ist,
überlege, ob die Indexgröße und die Arraygröße zu diesem Zeitpunkt stimmen, wovon sie abhängen usw.,

eins der beiden (Array-Größe oder Index) muss ja falsch sein

----

wichtiger Tipp: mit einer kleinen Datei anfangen, deine hat wenigestens noch nicht 100te Einträge,
aber was bei 7 Einträgen falsch läuft geht meist genauso bei 3-6 Einträgen schief,
fange klein mit 1, 2, 3 usw. an, bis zum ersten Mal ein Fehler auftritt

einstellige Zahlen sind sicher auch leichter zu verfolgen
 
Die Nummer von der Exception ist 7.
Das komische ist, dass mein Programm mittendrin abbricht..
mit der o.g. fehlermeldung.Das heisst es läuft bis ca. Mitte und dann gibt es einen Abbruch....
 
Warum postest du nicht einfach die komplette Fehlermeldung?

(aus der Eingabeaufforderung kann man übrigens auch rauskopieren, einfach markieren und Enter drücken)
 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
at Savings.main<Savings.java:84>

jetzt weiss ich dass der Fehler in der Zeile 84 liegt...

Aber wo ist der Fehler drin?
 
wo ist der Fehler in dem von dir geposteten Code? Vermutlich Zeile 74, oder?

zerleg mal die lange Zeile und lass dir die Werte für l un v ausgeben.

vermutlich liegt es aber an dem hier

Code:
v=l+1;

denn du erhöhst zuerst l und v um 1 und dann übergibst du den Wert von l+1 v. Dies überschreitet vermutlich die Grenze des Arrays.
Nur ne Vermutung.
 
Code:
       //Berechung des Savings

        int l = 0;
        int v = 1;
        for (int k = 0; k < (array.length - 1); k++) {
            for (int d = 0; d < (array.length - 2); d++) {
                if (v == array.length) {
                    System.out.println("");
                    System.out.println("Fehler: v=" + v + "  array.length=" + array.length + " <-----------");
                    break;
                }
                int bla9 = array[l][array.length] + array[v][array.length] - array[l][v];

                v++;

                System.out.print(bla9 + "\t");
            }
            System.out.println();
            l++;
            v = l + 1;
        }
Vermutlich ist diese Bedingung der zweiten for Schleife falsch:
d < (array.length - 2)

So gibt's jedenfalls keine Exception mehr:
d < (array.length - 1 - l)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben