1. #1

    Registriert seit
    19.11.2011
    Beiträge
    2.128
    Thanked 1.937 Times in 1.180 Posts

    Standard Array befüllen ohne immer den Index anzugeben

    Hallo.

    Habe hier einen Code, der in der Zeile
    blt[blt.length] = new Verein(a, b, c , d);
    
    fehlschlägt.

    Vorhaben: Dem Array ohne immer den Index mitzugeben , ein neues Element hinzufügen. Es muss bei einem Array bleiben, darf keine List nehmen.

    Fehler: java.lang.ArrayIndexOutOfBoundsException.


    public class VereinsManager
    {
    private Verein[] blt = new Verein[18];

    {
    ad("BvB" , 12, 19, 44);

    for(Verein d : blt)
    {
    System.out.println(d.getName() + " " + d.getGames() + " " + d.getRank() + " " + d.getPoints());
    }


    }

    public VereinsManager(){}

    public void ad(String a, int b, int c, int d)
    {
    blt[blt.length] = new Verein(a, b, c , d);
    }



    Kann mir jemand sagen, warum das fehlschlägt?

  2. #2
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    8.014
    Thanked 9.385 Times in 3.223 Posts
    Blog Entries
    5

    Standard AW: Array befüllen ohne immer den Index anzugeben

    Weil der Index 0-Basierend ist. Element 1 hat den Index 0, und das letzte Element 18 somit den Index 17. Da dein Array eine Länge von 18 hat, greifst du mit Index 18 auf das 19. Element zu, welches es nicht gibt. Daher die Exception. Wenn du variabel auf das letzte Element zugreifen willst, musst du von der Länge des Arrays eins subtrahieren. Möchtest du generell Elemente hinzufügen ohne jedes mal den Index angeben zu müssen, verwende einen Zähler oder direkt einen dynamischen Array.
    Damit könntest du dann so etwas machen:

    ArrayList<Verein> vereine = new ArrayList<Verein>();
    vereine.add(new Verein(a,b,c,d));

    Und für Java haben wir einen eigenen BBCode (java statt code, wird im erweiterten Editor auch oben angezeigt), mit entsprechend passendem Syntaxhighlighting für Java, bitte zukünftig diesen nutzen. Habs ediert.


  3. The Following User Says Thank You to DMW007 For This Useful Post:

    Essah (24.11.2013)

  4. #3
    Avatar von Nuebel
    Registriert seit
    23.11.2013
    Beiträge
    447
    Thanked 370 Times in 241 Posts

    Standard AW: Array befüllen ohne immer den Index anzugeben

    Wie mein Vorposter bereits richtig erwähnte, fangen Indices bei 0 an. Der Index für das letzte Element im Array lautet also array.length - 1.
    Da du keine Listen verwenden darfst, kannst du dir eine Hilfsmethode oder -klasse schreiben, wenn dir die Angabe von Indices so nervt.

    Eine kleine Klasse DynamicArray könnte so aussehen:

    import java.lang.reflect.Array;

    public class DynamicArray<T> {

    public static void main(String[] args) {
    DynamicArray<Integer> da = new DynamicArray<>(Integer.class, 5);
    for (int i = 0; i < 5; ++i) {
    da.add(i*i);
    System.out.println("Element at index " + i + ": " + da.get(i));
    }
    // Eigentlich ungültigen Index 5 testen:
    da.add(100);
    System.out.println("Element at index 5:" + da.get(5));
    }

    // ---------------------------------------------------------------------

    private T[] array;
    private Class<T> clazz;
    private int capacity;
    private int currentIndex;

    public DynamicArray(Class<T> clazz, int capacity) {
    this.clazz = clazz;
    array = (T[]) Array.newInstance(clazz, capacity);
    this.capacity = capacity;
    currentIndex = 0;
    }

    public final void add(T element) {
    checkNewCapacityIsNeeded();
    array[currentIndex] = element;
    ++currentIndex;
    }

    public final T get(int i) {
    if (i < 0 || i >= capacity)
    throw new IllegalArgumentException("invalid index: " + i);

    return array[i];
    }

    private final void checkNewCapacityIsNeeded() {
    if (currentIndex == capacity) {
    T[] newArray = (T[]) Array.newInstance(clazz, ++capacity);
    for (int i = 0; i < capacity-1; ++i) {
    newArray[i] = array[i];
    }
    array = (T[]) newArray.clone();
    }
    }
    }


    Für deinen kleinen Fall dürfte eine Hilfsmethode allerdings ausreichen. Speicher dazu den aktuellen Index und inkrementiere denselbige, wenn ein Element hinzugefügt wird. Vergiss aber nicht zu überprüfen, ob der Index gültig ist.

  5. The Following User Says Thank You to Nuebel For This Useful Post:

    Essah (24.11.2013)

  6. #4
    Avatar von Essah
    Registriert seit
    08.01.2012
    Beiträge
    279
    Thanked 69 Times in 45 Posts
    Blog Entries
    1

    Standard AW: Array befüllen ohne immer den Index anzugeben

    Wenn du den Index nicht immer angeben willst würde doch eigentlich etwas in dieser Art schon reichen:


    Verein[] Vereine = new Verein[18];
    int ArrayPosition = 0;

    public void Hinzufuegen(Verein derVerein){
    Vereine[ArrayPosition] = derVerein;
    ArrayPosition++;
    }

  7. The Following User Says Thank You to Essah For This Useful Post:


Ähnliche Themen

  1. Computer immer laufen lassen ohne Unterbrechung geht das?
    Von Sido im Forum Internet und Technik
    Antworten: 14
    Letzter Beitrag: 03.02.2014, 16:35
  2. Dezimalzahlen im Array
    Von Devon im Forum PHP
    Antworten: 13
    Letzter Beitrag: 04.07.2013, 20:08
  3. Knuddels Band-Index?
    Von Chrissy im Forum Knuddels Allgemein
    Antworten: 3
    Letzter Beitrag: 11.05.2013, 22:06
  4. Antworten: 3
    Letzter Beitrag: 02.05.2013, 22:48
  5. Index mit Passwort schützen?
    Von x BoooM x im Forum Webmaster
    Antworten: 6
    Letzter Beitrag: 23.01.2012, 22:27
Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.