# Problem: "ArrayIndexOutOfBounds Exception"



## Marie Curie (27. Sep 2007)

Hallo alle miteinander,

habe gerade ein Problem mit einer for-Schleife und einer ArrayList.
Die ArrayList wird durch die for-Schleife durchlaufen und soll nach der Reihe einem Vector hinzugefügt werden.
Der Vector dient als Spaltenbezeichnung für eine JTable.

Eigentlich kein Problem...aber ich komme wegen der o. g. Exception weiter:


```
if(!(bezeichnung.size() == 0)){

			for(int i = 1; i <= bezeichnung.size() - 1; i++){
					String eineSpalte = bezeichnung.get(i);
					bezeichnungsVector.add(eineSpalte);
			}
		}
	}
```

Da das bisher immer funktioniert hat, verstehe ich nicht, was daran falsch ist?!

Hoffe ihr könnt mir helfen.

Liebe Grüße,
Marie


----------



## Guest (27. Sep 2007)

wieso das umständliche -1 ?

(int i=1; i < bezeichnung.size(); i++)


----------



## SlaterB (27. Sep 2007)

> was daran falsch ist?! 
absolut nichts, läuft tadellos:


```
public class Test
{

    public static void main(String[] args)
        throws Exception
    {

        List<String> bezeichnung = new ArrayList<String>();
        bezeichnung.add("a");
        bezeichnung.add("b");

        Vector<String> bezeichnungsVector = new Vector<String>();

        // dein Code
        if (!(bezeichnung.size() == 0))
        {
            for (int i = 1; i <= bezeichnung.size() - 1; i++)
            {
                String eineSpalte = bezeichnung.get(i);
                bezeichnungsVector.add(eineSpalte);
            }
        }
        // dein Code


        System.out.println(bezeichnungsVector);
    }
}
```

es hängt also von deinem restlichen Code ab,

-----

dass du bei Index 1 anfängst, das erste Element der Liste aber Index 0 hat, ist gewollt?


----------



## Marco13 (27. Sep 2007)

Die Abfrage
if(!(bezeichnung.size() == 0)){ 
könnte man etwas lesbarer schreiben
if(bezeichnung.size() != 0){
oder
if(bezeichnung.size() > 0){  
aber sie ist sowieso überflüssig: Wenn bezeichnung.size()==0 ist, wird die schleife soewieso nicht durchlaufen. Poste ggf. mal was compilierbares, wo der Fahler auftritt, oder schreib' in deine Schleife

```
for(int i = 1; i <= bezeichnung.size() - 1; i++)
{
    System.out.println("i ist "+i+" und size is "+bezeichnung.size());
```
das hilft vielleicht schon.


----------



## Marie Curie (27. Sep 2007)

Danke für das schnelle Post!

bei 


```
i < bezeichnung.size()
```

nimmt er alle Elemente der ArrayList, bis auf das Letzte.
(Und die Exception wird weiterhin geworfen)

mit


```
i <= bezeichnung.size() - 1
```

nimmt er alle Elemente die kleiner sind als die Größe und das Letzte.
Mach ich das -1 nicht, versucht er den Index der ArrayList auf die Größe des Inhaltes zu setzen, das geht aber nicht.
z.B.

ArrayList Größe 6
Index von 0 - 5

klar, dass dann eine Exception geworfen wird.

Was ich vergessen hatte:

```
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0
```

Liebe Grüße


----------



## SlaterB (27. Sep 2007)

i < bezeichnung.size()
ist mit
i <= bezeichnung.size() - 1
äquivalent,
egal was du dir an Begründungen zusammenbastelst,

-------

egal, sehr wahrscheinlich liegt es daran, dass du mit i=1 statt i=0 anfängst,
so hast du zu wenig Elemente kopiert


----------



## Marie Curie (27. Sep 2007)

i < bezeichnung.size()

liefert mir trotzdem nicht alle Elemente, das letzte bleibt verschollen.

int i  = 1 war ein Schreibfehler, im Code fängt der Zähler bei 0 an.

Ich wüsste nicht wo sonst der Fehler noch auftreten kann.


```
System.out.println("i ist "+i+" und size is "+bezeichnung.size());
```

funktioniert ohne Probleme (ohne Exception). Aber sobald ich die Elemente wieder in den Vector übertragen will erhalte ich eine Exception


----------



## SlaterB (27. Sep 2007)

> i < bezeichnung.size() 
> liefert mir trotzdem nicht alle Elemente, das letzte bleibt verschollen. 

nehmen wir mal eine Liste mit 3 Elementen, Size = 3, Indexe 0, 1, 2

i <= bezeichnung.size() - 1


i= 0 ok
i= 1 ok
i= 2 ok
i= 3 Abbruch, alle drangekommen


 i < bezeichnung.size() 


i= 0 ok
i= 1 ok
i= 2 ok
i= 3 Abbruch, alle drangekommen



wo zum Himmel siehst du einen Unterschied??
warum zum Himmel sollte das letzte verschollen bleiben??



--------

dass dein Code funktioniert habe ich ja im ersten Posting geschrieben,
jetzt kannst du noch 10x schreiben dass du nicht weiß, wo der Fehler auftreten kann,
dieses Topic bring das nicht voran


----------



## Marie Curie (27. Sep 2007)

ändert nichts an der Ausgabe, die ich habe. Da ist das letzte Element trotzdem nich drin.

Lag an dem Vector, hab jetzt in der Methode einen eigenen Vector erstellt. Der Vector bezeichnung bekommt dann diesen Vector zugewiesen.

Die Tabelle wird in einem neuen Dialog angezeigt, nur leider bleibt der Platz, an dem die Tabelle steht, leer. Vorher wurde die Tabelle angezeigt, obwohl die Exception geworfen wurde.

Methode, die den DB-Query ausführt, das Ergebnis "results" der Tabelle als Werte zuweist.

```
public Vector<Vector<String>> leseDB(ArrayList<String> spalten, ArrayList<String> tabellen, String suchbegriff){
		
		statement = null;
		result = null;
		
		try 
		{		
				StringBuilder select = new StringBuilder("SELECT ");
			   	for(int i = 0; i <= spalten.size(); i++){
					
					if(i == spalten.size() - 1){
						select.append(spalten.get(i) + " ");
					}
					else if(i < spalten.size() - 1){
						select.append(spalten.get(i) + ", ");
					}
			   	}
				StringBuilder from = new StringBuilder("FROM ");
				from.append(tabellen.get(0));
				from.append(" INNER JOIN ");
				for(int n = 1; n <= tabellen.size() - 1; n++){
					from.append(tabellen.get(n) + " ON (Kunde.Kundennummer = " + tabellen.get(n) + ".Kundennummer)");
				}
				
				StringBuilder where = new StringBuilder(" WHERE ");
				where.append(suchbegriff + ";");
				
				statement = connection.createStatement();
				result = statement.executeQuery(select.toString() + from.toString() + where.toString());

				if(result != null){
					Vector<Vector<String>> results = new Vector<Vector<String>>();
					
					java.sql.ResultSetMetaData rsmd = result.getMetaData(); 
					x = rsmd.getColumnCount();
					
					while(result.next()){	

						Vector<String> detail = new Vector<String>();
					
						detail.add(String.valueOf(result.getInt("Kundennummer")));
						detail.add(result.getString("Kundenname"));
						detail.add(result.getString("Plz"));
						detail.add(result.getString("Ort"));
						detail.add(result.getString("EMail"));
						results.add(detail);
						
					}
					System.out.println(results);
					System.out.println(getBezeichnungen());
					meinModel.setDataVector(results, getBezeichnungen());
					return results;
				}
		}
		catch (SQLException ex1) 
		{
				parent.fehlerBearbeitung(ex1.getMessage());
				ex1.printStackTrace();
		}
		return null;
	}
```

Die Methode erzeugt die Tabelle und liefert sie zurück.

```
public javax.swing.JTable tabelleErzeugen(){
		meineTabelle = new javax.swing.JTable(meinModel);
		meineTabelle.setModel(meinModel);

		System.out.println(meineTabelle.getRowCount());
		
		return meineTabelle;
	}
```

Aus einem Dialog wird die Methode tabelleErzeugen() dann aufgerufen und sollte angezeigt werden, aber wie gesagt der Platz der Tabelle bleibt leer.

Liebe Grüße,
Marie


----------



## Marie Curie (28. Sep 2007)

Hallo zusammen,

ich versuchs noch ein Mal vllt hat ja doch jemand ein Problem.

Hab auf verschiedenste Weise versucht, Werte aus einer DB in einer Tabelle anzuzeigen. Eigentlich, rein theroetisch, kein Problem.
Das neue an der Sache: Die Spalten, die in der Tabelle angezeigt werden sollen und aus der DB abgefragt werden, werden vom Benutzer bestimmt.

Dafür werden dem Benutzer verschiedene Checkboxes zur Verfügung gestellt um die gewünschten Spalten anzuzeigen. Außerdem kann aus einer Liste ausgewählt werden, nach was speziell gesucht wird (where Bedingung in SQL Stmt).

Um den Query auf die DB durchzuführen, habe ich mittels eines StringBuilders ein SQL Stmt zusammengesetzt. Dieses ging meistens, kleine Anpassungen hier und da wären bestimmt noch nötig.

Das Ergebnis des Querys sollte in einer Tabelle in einem extra Dialog angezeigt werden. Da die Anzahl der Spalten in dieser Tabelle auch variabel ist, habe ich diese je nach ausgewählten Spalten aus einer ArrayList entnommen und einem Vector "Bezeichnungen" zugewiesen.

Der Query funktioniert, lass ich mir den Ergebnis Vector auf der Konsole ausgegeben, erhalte ich das Ergebnis. Es klappt nur partout nicht, den Ergebnis Vector der Tabelle zuzuweisen und diese anzuzeigen. Der Dialog wird zwar erzeugt, aber der Platz an dem die Tabelle schließlich sein sollte, bleibt leer!

In vorigem Code wurde ein ArrayIndexOutOfBounds Exception geworfen, aber die Tabelle wurde wenigstens angezeigt.

Der Code hat sich unwesentlich geändert, also ist der oben gepostete Code immer noch gültig. Falls vllt noch weiterer Bedarf an Code besteht, poste ich diesen gerne.

Würde mich über eure Hilfe freuen, da ich momentan kein Mittel mehr habe  :autsch: 

Liebe Grüße,
Marie


----------



## Murray (28. Sep 2007)

Siehst du denn die Ausschreibung mit der Zeilenzahl aus der Methode tabelleErzeugen noch in der Konsole?


----------



## Marie Curie (29. Sep 2007)

Ja, ich habe mir die Zeilenzahl auf der Konsole ausgeben lassen. Diese stimmt mit dem Inhalt im Datenvektor überein. Also wird der Tabelle ja ein Datenwert zugewiesen.

Liebe Grüße


----------

