Index 16 out of bounds for length 16

Thermaler

Mitglied
Guten Abend,
ich bin relativ neu in java und habe diesen error: java.lang.ArrayIndexOutOfBoundsException: Index 16 out of bounds for length 16
und habe keine Ahnung wie ich es fixen könnte bitte um Hilfe Fehler wird hier ausgelöst


[CODE lang="java" title="Hier der Fehler code" highlight="18"]public void loadMap(String path) {
try {
System.out.println("Loading... (" + path + ")");
File testMap = new File(path);

BufferedReader br = new BufferedReader(new FileReader(testMap));

int col = 0;
int row = 0;

while (col < gp.maxWorldCol && row < gp.maxWorldRow) {
String line = br.readLine();
while (col < gp.maxWorldCol) {
String numbers [] = line.split(" ");

int num = Integer.parseInt(numbers[col]);

mapTileNum[col] [row] = num;
col++;
}
if (col == gp.maxWorldCol) {
col = 0;
row++;
}
}
br.close();
}catch (Exception e) {
e.printStackTrace();
}
}[/CODE]

Falls ihr noch mehr braucht einfach melden
 
G

Gelöschtes Mitglied 65838

Gast
arrays fangen bei 0 an zu zählen von den plätzen

also ist der letzte index bei length 16 der platz 15 weil 0 auch ein platz ist
 

Thermaler

Mitglied
du machst ein -1 dazu und fängst beim zählen bei 0 an
Es tut mir leid bin aber schon sehr müdde und deswegen gerade nicht mehr mit 100% dabei aber wo muss ich das jetzt genau einsetzten hier mein ganzer code

Java:
package Tile;

import Main.GamePanel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;

public class TileManager {

    GamePanel gp;
    Tile[] tile;
    int [] [] mapTileNum ;
    File grassPath = new File("res\\tiles\\grass.png");
    File stonePath = new File("res\\tiles\\stone.png");
    File wood_wallPath = new File("res\\tiles\\wood_wall.png");
    File waterPath = new File("res\\tiles\\water.png");
    File grass_flowerPath = new File("res\\tiles\\grass_flower.png");


    public TileManager(GamePanel gp) {
        this.gp = gp;
        tile = new Tile[10];
        mapTileNum = new int[gp.maxScreenCol][gp.maxScreenRow];
        getTileImage();
        loadMap("res\\maps\\testmap.txt");
    }

    public void getTileImage() {
        try {

            tile[0] = new Tile();
            tile[0].image = ImageIO.read(grassPath);
            tile[1] = new Tile();
            tile[1].image = ImageIO.read(stonePath);
            tile[2] = new Tile();
            tile[2].image = ImageIO.read(wood_wallPath);
            tile[3] = new Tile();
            tile[3].image = ImageIO.read(waterPath);
            tile[4] = new Tile();
            tile[4].image = ImageIO.read(grass_flowerPath);

        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    private int worldCol = 0;
    private int worldRow = 0;

    public void draw(Graphics2D g2) {

        try {

            while (worldCol < gp.maxWorldCol && worldRow < gp.maxWorldRow) {

                int tileNum = mapTileNum[worldCol] [worldRow];

                int worldX = worldCol * gp.tileSize;
                int worldY = worldRow * gp.tileSize;
                int screenX = worldX - gp.player.worldX + gp.player.screenX;
                int screenY = worldY - gp.player.worldY + gp.player.screenY;

                g2.drawImage(tile[tileNum].image, screenX,screenY, gp.tileSize, gp.tileSize, null);
                worldCol++;

                if (worldCol == gp.maxWorldCol) {
                    worldCol = 0;
                    worldRow++;
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
            System.out.println(e);
        }
    }

    public void loadMap(String path) {
        try {
            System.out.println("Loading... (" + path + ")");
            File testMap = new File(path);

            BufferedReader br = new BufferedReader(new FileReader(testMap));

            int col = 0;
            int row = 0;

            while (col < gp.maxWorldCol && row < gp.maxWorldRow) {
                String line = br.readLine();
                while (col < gp.maxWorldCol) {
                    String numbers [] = line.split(" ");

                    int num = Integer.parseInt(numbers[col]);

                    mapTileNum[col] [row] = num;
                    col++;
                }
                if (col == gp.maxWorldCol) {
                    col = 0;
                    row++;
                }
            }
            br.close();
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

}
 
G

Gelöschtes Mitglied 65838

Gast
Java:
col < gp.maxWorldCol -1 && row < gp.maxWorldRow -1)
*glaube ich dass das da ist*

ich beschwer mich nicht über den code weil ich sonst eh wieder der böse bin ..

aber als kleiner Hinweis:
canvas.png
 
G

Gelöschtes Mitglied 65838

Gast
Java:
while (col < gp.maxWorldCol -1 )
hab das übersehen, das musst du auch noch runter nehmen um 1
 
G

Gelöschtes Mitglied 65838

Gast
es ist halt allgemein ein schlechter ansatz ... würdest du die Reichweite deiner arrays eintragen und dann die Reichweiten um 1 reduzieren müsstest du nirgends mehr das -1 angeben und es wird überall funktionieren

ob da so ein array überhaupt angebracht ist bezweifle ich aber kannst du ja machen wie du willst
 

Thermaler

Mitglied
Der Fehler ist immer noch da.
In Zeile 93

[CODE lang="java" highlight="93"]package Tile;

import Main.GamePanel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.io.*;

public class TileManager {

GamePanel gp;
Tile[] tile;
int [] [] mapTileNum ;
File grassPath = new File("res\\tiles\\grass.png");
File stonePath = new File("res\\tiles\\stone.png");
File wood_wallPath = new File("res\\tiles\\wood_wall.png");
File waterPath = new File("res\\tiles\\water.png");
File grass_flowerPath = new File("res\\tiles\\grass_flower.png");


public TileManager(GamePanel gp) {
this.gp = gp;
tile = new Tile[10];
mapTileNum = new int[gp.maxScreenCol][gp.maxScreenRow];
getTileImage();
loadMap("res\\maps\\testmap.txt");
}

public void getTileImage() {
try {

tile[0] = new Tile();
tile[0].image = ImageIO.read(grassPath);
tile[1] = new Tile();
tile[1].image = ImageIO.read(stonePath);
tile[2] = new Tile();
tile[2].image = ImageIO.read(wood_wallPath);
tile[3] = new Tile();
tile[3].image = ImageIO.read(waterPath);
tile[4] = new Tile();
tile[4].image = ImageIO.read(grass_flowerPath);

}catch (IOException e) {
e.printStackTrace();
}
}

private int worldCol = 0;
private int worldRow = 0;

public void draw(Graphics2D g2) {

try {

while (worldCol < gp.maxWorldCol && worldRow < gp.maxWorldRow) {

int tileNum = mapTileNum[worldCol] [worldRow];

int worldX = worldCol * gp.tileSize;
int worldY = worldRow * gp.tileSize;
int screenX = worldX - gp.player.worldX + gp.player.screenX;
int screenY = worldY - gp.player.worldY + gp.player.screenY;

g2.drawImage(tile[tileNum].image, screenX,screenY, gp.tileSize, gp.tileSize, null);
worldCol++;

if (worldCol == gp.maxWorldCol) {
worldCol = 0;
worldRow++;
}
}
}catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
}

public void loadMap(String path) {
try {
System.out.println("Loading... (" + path + ")");
File testMap = new File(path);

BufferedReader br = new BufferedReader(new FileReader(testMap));

int col = 0;
int row = 0;

while (col < gp.maxWorldCol -1 && row < gp.maxWorldRow -1) {
String line = br.readLine();
while (col < gp.maxWorldCol -1) {
String numbers [] = line.split(" ");

int num = Integer.parseInt(numbers[col]);

mapTileNum[col] [row] = num;
col++;
}
if (col == gp.maxWorldCol) {
col = 0;
row++;
}
}
br.close();
}catch (Exception e) {
e.printStackTrace();
}
}

}
[/CODE]
 
G

Gelöschtes Mitglied 65838

Gast
du hast spaghetti code... den fehler zu finden ist wie die nadel im java haufen, auch wenn man ihn findet hast du am ende wieder noch nur "schlecht lesbaren" code... mach doch erstmal ne klasse für dieses und eine für jenes , somit du in einem blick sagen kannst was hier passiert in einer klasse

deine klasse macht im moment 30 sachen mit 4 arrays .. das ist schon ein anzeichne für blöde situation
 

KonradN

Super-Moderator
Mitarbeiter
Also irgendwie frage ich mich gerade, was hier abgeht: Der Aufbau des Codes ist in Ordnung gewesen! Da war keine Verschiebung der Indices - wo bitte meinst Du das gesehen zu haben im Code?

Also wenn Du hast:
Java:
mapTileNum = new int[gp.maxScreenCol][gp.maxScreenRow];
dann ist die Schleife, so wie sie von Anfang an war, korrekt. Und du startest da korrekter Weise bei 0:
Java:
            int col = 0;
            int row = 0;

und prüfst auf < in der Bedingung:
Java:
            while (col < gp.maxWorldCol && row < gp.maxWorldRow) {

Das sollte also klappen. Der Wechsel ist auch korrekt, denn nach dem col++ prüfst Du, ob die Grenze erreicht ist um dann col auf 0 zu setzen und row um eins zu erhöhen.

Dies führt nur dann zu einem Problem, wenn sich die Werte in gp verändern könnten. Daher würde ich die initialisierung so lassen aber in der Schleife immer auf die Größe des Arrays zugreifen! Aber so lange die Werte in gp nicht verändert werden, passiert da nichts (Also wenn das z.B. finale Werte sind)!

==> Bitte mach die Änderungen, die Du da gemacht hast mit dem -1 Rückgängig!

Und wo genau passiert der Fehler? An einer Stelle hast Du die Zeile:
int num = Integer.parseInt(numbers[col]);
markiert gehabt. Das deutet dann aucf keinen Fehler im Code sondern auf ein Fehler in der Datei hin. Nach dem Split hast Du einfach nicht genug Elemente in dem Ergebnis.

Was da sein kann:
a) Eine Leerzeile oder so hat sich evtl. eingeschlichen. Evtl. einfach mal etwas Logging einbauen um dann mehr Informationen zur Laufzeit zu bekommen. Das Problem dieses Punktes ist also String line = br.readLine();.
b) Du machst einfach nur ein String numbers [] = line.split(" "); - die Größe des Arrays kann also von der notwendigen Größe abweichen. Hier sollte also ein Check stattfinden. Wie darauf reagiert wird, musst Du wissen: Was ist, wenn da zu viele Werte sind? Was ist, wenn da zu wenig Werte sind? Dieser Punkt sollte noch überdacht werden!

Also mögliche Fehlerursachen, die ich sehe - noch einmal zusammen gefasst:
a) Änderungen durch falsche Hinweise - das rückgängig machen!
b) Sind die Werte in gp ggf. veränderlich?
c) Eingelesene Zeilen können fehlerhaft sein und bei deinem Code zu Problemen führen.

Und generell noch ein paar Hinweise zur Strukturierung des Codes und technischer Dinge:
a) Abhängigkeiten minimieren! (Das sieht ggf. noch nicht richtig rund aus)
b) Besser schneiden - so hast Du ja offensichtlich eine Map. Also kannst Du diese auch entsprechend darstellen in einer Klasse. Die Größe einer Map ist unabhängig von einem GamePanel. Die Map ist und bleibt bei einer Größe unabhängig wie diese angezeigt wird.
c) Laden / Speichern einer Map kann separat in einer Datei abgebildet werden. Dann hast Du ggf. einen MapLoader oder so.
d) Der TileManager managed die zur Verfügung stehenden Tiles. hat aber dann kein Interesse an der Map. Tiles werden bitte als Resourcen geladen und nicht per File - dann kannst Du es auch aus einem Jar laden und so. Such einfach mal nach getResourceAsStream - da wirst Du dann auch hier im Forum viele Threads finden!
 

Oneixee5

Top Contributor
Ich sehe den gezeigten Code auch als etwas problematisch an. Im Fehlerfall wird der Reader nicht geschlossen und die Daten werden eigentlich gar nicht geprüft. Die Daten zu lesen ist vermutlich auch nur eine Seite der Medaille.
Es soll also ein Array aus einer Datei gelesen werden und vermutlich auch mal gespeichert. Ein Array ist ein Object und ein Reader ist für Text. Das ist das erste Problem - das Vorgehen erzeugt einen großen Overhead und ist fehleranfällig. Dabei ist es eigentlich ganz einfach:
Java:
    public static void main(final String[] args) throws IOException, ClassNotFoundException {

        System.out.println("create array");
        final int[][] arr = new int[5][5];
        for (int i = 0; i < arr.length; i++) {
            Arrays.fill(arr[i], i+1);
            System.out.println(Arrays.toString(arr[i]));
        }

        final Path file = Path.of("test.dat");

        System.out.println("\nstore array");
        try (final ObjectOutputStream oos = new ObjectOutputStream(
                Files.newOutputStream(file))) {
            oos.writeObject(arr);
        }

        System.out.println("load array");
        try (ObjectInputStream ois = new ObjectInputStream(
                Files.newInputStream(file))) {
            final int[][] dat = (int[][]) ois.readObject();
            for (final int[] is : dat) {
                System.out.println(Arrays.toString(is));
            }
        }

    }
Bash:
create array
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 3]
[4, 4, 4, 4, 4]
[5, 5, 5, 5, 5]

store array
load array
[1, 1, 1, 1, 1]
[2, 2, 2, 2, 2]
[3, 3, 3, 3, 3]
[4, 4, 4, 4, 4]
[5, 5, 5, 5, 5]
 

KonradN

Super-Moderator
Mitarbeiter
Also Object Streams sind nun wirklich das Letzte, zu dem ich raten wüde. Die Text-Dateien, die er hier einliest, dürfte er ja von hand generiert haben und auch erst einmal nur von hand editieren. Binary Serialization ist ansonsten auch nicht ganz unproblematisch, so dass dieses erste "Ach wie toll das auf Anhieb funktioniert" nicht selten auch in Bauchschmerzen endet.

Nicht ohne Grund nutzen sonst eigentlich alle eben doch genau diese Variante, dass Daten als Text dargestellt und dann wieder aus dem Text rekonstruiert werden (JSON, XML, ...)

Aber das nur als meine paar Cent zu dem Thema.
 

Oneixee5

Top Contributor
Im XML-Format würde das genauso funktionieren:
Java:
        System.out.println("\nstore array");
        try (XMLEncoder encoder = new XMLEncoder(Files.newOutputStream(file));) {
            encoder.writeObject(arr);
        }

        System.out.println("load array");
        try (XMLDecoder decoder = new XMLDecoder(Files.newInputStream(file))) {
            final int[][] dat = (int[][]) decoder.readObject();
            for (final int[] is : dat) {
                System.out.println(Arrays.toString(is));
            }
        }
Hätte ich zu JSON geraten, wäre der Vorwurf gekommen, dass eine externe Lib verwendet wird.
Ich halte gar nichts davon Daten in menschenlesbaren Text umzuwandeln, abzuspeichern und wieder zurück. Der Grund ist ganz einfach: Wenn Menschen glauben, dass sie solche Daten verstehen werden sie diese auch ändern. CSV ist aus Entwicklersicht ein Alptraum, weil man sich einfach auf nichts verlassen kann. Aus diesem Grund beginnt man dann wieder mit Checksummen, Signierung oder Verschlüsselung zu hantieren.
Es gibt im JRE 8 über 5000 Klassen, die Serializable implementieren - wenn Serialization also so etwas so Schlechtes wäre, dann wäre nicht nur dieser Code "nicht ganz unproblematisch" sondern Java an sich.
 

mihe7

Top Contributor
Hätte ich zu JSON geraten, wäre der Vorwurf gekommen, dass eine externe Lib verwendet wird.
Als Vertreter der "nicht für jeden Scheiß eine Lib"-Fraktion fühle ich mich mal angesprochen :)

Es geht um den Aufwand vs. Nutzen und es ist keineswegs so, dass ich keine Libs verwende oder verwenden will. Wo es affig wird: wenn z. B. wegen der Prüfung, ob ein String null oder leer ist, eine 500+ KB große Apache Commons Lang eingebunden wird. Was soll das?

Ähnlich bei CSV. Ja, mag sein, dass es CSV-Dateien gibt, wo das Einlesen problematisch ist (z. B. mehrzeilige) und sich eine Lib lohnt, aber bitte: ein line.split(delimiter, Integer.MAX_VALUE) reicht in 99 % der Fälle vollkommen aus.
 

White_Fox

Top Contributor
reicht in 99 % der Fälle vollkommen aus
Wenn ich daran denke wie oft ich schon das eine übrige Prozent erwischt habe...
Ich kann deine Argumentation ja nachvollziehen, so ist das nicht. Aber wenn 500kB ein Problem sind ist doch sowieso alles zu spät.


Ich halte gar nichts davon Daten in menschenlesbaren Text umzuwandeln, abzuspeichern und wieder zurück.
Das denke ich auch. Und ernsthaft große verschachtelte XML-Dateien blickt ein Mensch auch mit normalem Text schwer durch. Von Menschen sollte lesbar sein, was ein Mensch lesen soll und muß. Wenn mein Programm aber Daten speichern soll, hab ich da andere Prioritäten: Schnelles Schreiben/Lesen, z.B. Oder Speicher sparen.
 

mihe7

Top Contributor
Aber wenn 500kB ein Problem sind ist doch sowieso alles zu spät.
Alles zu spät ist, wenn man lieber fünf Zeilen ins POM einträgt, dem Projekt eine weitere Abhängigkeit sowie 500 kB mehr hinzufügt, anstatt einfach
Java:
    public static boolean isEmpty(String string) {
        return string == null || string.isEmpty();
    }
zu schreiben :p
 

KonradN

Super-Moderator
Mitarbeiter
Bei den Texten sehe ich aber, dass es in erster Linie auch nur eine Resource ist, die einmal geschrieben wird. Daher sehe ich da nicht unbedingt einen großen Unterschied zu z.B. Java Code. Der wird von einem Menschen geschrieben und dann verarbeitet. Es iswt eben kein Medium, das ständig gelesen und geschrieben wird wie eine Daten-Datei.

Klar, ein Map Editor wäre besser, aber der muss halt auch erst einmal geschrieben werden. Und so lange wie es den nicht gibt ist es auf jeden Fall ein valides Mittel.

Als ich sowas mal geschrieben hatte, hatte ich Maps als Text-Files z.B. nur für einen reinen Import vorgesehen.
 

Neumi5694

Top Contributor
Der Fehler ist immer noch da.
In Zeile 93
[/CODE]
Dort löst die vorher falsch gesetzte Zahl den Fehler aus. Aber gesetzt wurde sie vorher. Du musst halt dafür sorgen, dass col nie größer als 15 und nie kleiner als 0 wird.
Was du tun kannst: Prüfe den Werte nach jeder Zeile, in der er verändert wird. Schreib dafür eine isThisValueOk(int) Methode.
In dieser prüfst du dann die Grenzen und wirfst eine OutOfBounds Exception, wenn sie verletzt werden.
Dann siehst du genau, wann der Fehler auftritt.
Noch schöner wäre ein Wrapper anstatt der Variable, aber das wäre wohl etwas Overkill für diese einfache Sache.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
coolian warum bekomme ich ein string index out of bounds exception Allgemeine Java-Themen 17
H Index Out of Bounds bei Vector Allgemeine Java-Themen 4
Developer_X Array Index Out of Bounds Exception Allgemeine Java-Themen 1
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L Array und Index Allgemeine Java-Themen 26
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Y ArrayListe eingegebenen index entfernen Allgemeine Java-Themen 1
R Index in einem Array löschen Allgemeine Java-Themen 10
R Index in einem Array löschen Allgemeine Java-Themen 2
X Lucene index on disk Allgemeine Java-Themen 2
B Hirsch-Index berechnen Allgemeine Java-Themen 11
V Compiler-Fehler Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 125, Size: 125 Allgemeine Java-Themen 11
D ArrayList index auf gültigkeit prüfen Allgemeine Java-Themen 12
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
S Char-index aller Buchstaben..? Allgemeine Java-Themen 3
GianaSisters Klassen ArrayList Index Integer int Allgemeine Java-Themen 5
Jats ArrayList-Error Index: 1 Size:1 - Bitte um Hilfe Allgemeine Java-Themen 36
A Index Datei aus HTML-Dateien Allgemeine Java-Themen 7
T Index Fehler Allgemeine Java-Themen 9
N Inverted index / inverted list Allgemeine Java-Themen 2
G Hibernate search (Lucene) - Index wird nicht rechtzeitig erzeugt? Allgemeine Java-Themen 2
B TreeMap Index !!! Allgemeine Java-Themen 6
J fireIndexedPropertyChange(...) Wie gelangt man an den Index? Allgemeine Java-Themen 2
L kann in einem array der 1. index größer als der 2. sein? Allgemeine Java-Themen 10
M Java applet zusammen mit DHTML z-index Problem Allgemeine Java-Themen 2
M Implementation von Zugriffen auf Object[index] in der JVM Allgemeine Java-Themen 9
M Index eines Arrays ermitteln und als Integer ausgeben Allgemeine Java-Themen 7
G komischer out of bounds fehler Allgemeine Java-Themen 3
D JUNG Framework edge length Allgemeine Java-Themen 0
P Swing Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: npoints > xpoints.length || npoints > ypoints.length Allgemeine Java-Themen 5
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
Thallius JSONArray - the method length() is undefined for JSONArray Allgemeine Java-Themen 4
A ByteBuffer.get(byte[] dst,int offset,int length) Allgemeine Java-Themen 2
M Caesar-Verschiebung: IndexOutOfBoundsException bei Verschiebung > array.length Allgemeine Java-Themen 2
I URLConnection mit Chunked und Content-Length=-1 Allgemeine Java-Themen 4
L array.length-Problem Allgemeine Java-Themen 60
R array.length in For-Schleife verwenden? Allgemeine Java-Themen 22
K Cipherproblem: Invalid key length Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben