Frage von Lanaaaaaaa, 57

Java "cannot find symbol". Warum?

Ich habe folgenden Codeabschnitt, aus irgendeinen Grund funktioniert der Teil aber nicht:

public static void main(String [] argv) throws IOException
{
    java.io.DataInputStream in = new java.io.DataInputStream(System.in);
    eins t = new eins();                //Hier wird ein Fehler angezeigt "Cannot find symbol"
    World w = t.new World();

    System.out.println("ESC+ENTER to exit");            
    String key = in.readLine();

        while(key != "q") {
        w.keyPressed(key);
        System.out.println(w);
        key = in.readLine();
    }   
}

Kann mir jemand helfen und schreiben warum es so ist? o.O

Antwort
von Copyyy, 43

Erst einmal wäre es schön, den gesamten Stacktrace zu haben oder zumindest die Zeile, in der der Fehler wahrscheinlich ist.
Guck dir mal das an: 

 World w = t.new World();
Kommentar von Lanaaaaaaa ,

package asciidoom;

import java.io.*;

public class ASCIIDoom {

private static class eins {

public eins() {
}
}

protected class Position {

public int x;
public int y;

public Position(int _x, int _y) {
this.x = _x;
this.y = _y;
}

public int toIndex(int iWidth) {
return x + y * iWidth;
}
}

protected class GameTile {

public Position pos;

public GameTile() {
pos = new Position(0, 0);
}

public String toString() {
return "~";
}

public String draw(String s, int worldLength) {
int index = pos.toIndex(worldLength);
char[] chars = s.toCharArray();
chars[index] = this.toString().charAt(0);
return new String(chars);
}
}

protected class WallTile extends GameTile {

public String toString() {
return "#";
}
}

protected class EmptyTile extends GameTile {

public String toString() {
return " ";
}
}

protected class Player extends GameTile {

public String toString() {
return "@";
}

public void moveLeft() {
pos.x--;
}

public void moveRight() {
pos.x++;
}

public void moveUp() {
pos.y--;
}

public void moveDown() {
pos.y++;
}
}

protected class GameField {

public GameTile[][] field;
public int width;
public int height;

GameField(int _width, int _height, String stringField) {
this.width = _width;
this.height = _height;
field = new GameTile[width][height];

for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
switch (stringField.charAt(x + y * width)) {
case '#':
field[x][y] = new WallTile();
break;
case ' ':
default:
field[x][y] = new EmptyTile();
break;
}
}
}
} // constructor

public String toString() {
String result = "";
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
result += field[x][y].toString();
}
}

return result;
}
}

protected class World {

public GameField field;
public Player player;

public World() {
field = new GameField(3, 5, "#### ## ## ####");
player = new Player();
player.pos.x = 1;
player.pos.y = 1;
}

public void keyPressed(String s) {
if (s.isEmpty()) {
return;
}
switch (s.charAt(0)) {
case 'w':
player.moveUp();
break;
case 's':
player.moveDown();
break;
case 'a':
player.moveLeft();
break;
case 'd':
player.moveRight();
break;
default:
System.out.println("Key not found");
break;
}
}

public String toString() {
String s = field.toString();
s = player.draw(s, field.width);

String result = "\\ ";
for (int column = 0; column < field.width; ++column) {
result += (column % 10);
}
result += "\n";

for (int row = 0; row < s.length() / field.width; ++row) {
result += row % 10 + " " + s.substring(row * field.width, (row + 1) * field.width) + "\n";
}
return result;
}
}

public static void main(String[] argv) throws IOException {
java.io.DataInputStream in = new java.io.DataInputStream(System.in);
eins t = new eins(); 

World w = t.new World(); 


System.out.println("ESC+ENTER to exit");
String key = in.readLine();

while (key != "q") {
w.keyPressed(key);
System.out.println(w);
key = in.readLine();
}
}
}

Kommentar von Copyyy ,

Du hast da stehen: "test t= new test();", aber es gibt keine Klasse, die "test" heißt? Was willst du denn da machen?

Antwort
von Schachpapa, 19

Die Klasse World ist eine protected class innerhalb der Klasse ASCIIDoom.

Warum ist das so? Muss das so sein? Ich habe immer für jede Klasse eine Datei.

Wenn das so beabsichtigt ist, kannst du in der static main ein Object der Klasse World nur erzeugen, wenn ein Object der Klasse ASCIIDoom existiert.

Also statt

eins t = new eins();
World w = t.new World()

besser

ASCIIDoom a = new ASCIIDoom();
World w = a.new World();



Antwort
von daCypher, 49

Gibt's denn eine Klasse namens "eins", wovon du eine neue Variable erzeugen willst?

Kommentar von Copyyy ,

Auch wenn, ich habe noch nie eine Methode gesehen, in der ein Leerzeichen war..

Kommentar von Lanaaaaaaa ,

Eigentlich schon. Durch das erstellen der Klasse kommt aber dann ein neuer Fehler bei World w = t.new World(); 

Die Fehlermeldung ist dann die gleiche. 

Kommentar von daCypher ,

Oh, stimmt, das hab ich gar nicht gesehen. Das muss dann natürlich new t.World(); heißen.

Kommentar von Lanaaaaaaa ,

danke für die Antworte, leide geht es aber immer noch nicht :/ 

Hier:

http://goo.gl/xjzFSu

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten