Не удалось сослаться на уже объявленное поле объекта

У меня есть Obstacle класс с конструктором для объекта препятствия:

public class Obstacle {

    public String obstacleType;
    public int obstacleSize, obstacleXCoord, obstacleYCoord;

    public Obstacle(String getType, int getSize, int getXCoord, int getYCoord){

        obstacleType = getType;
        obstacleSize = getSize;
        obstacleXCoord = getXCoord;
        obstacleYCoord = getYCoord;

    }

}

В другом классе я импортирую Obstacle Класс и определить метод, generateObstacle, создание нового Obstacle называется newObstacle, Я также делаю несколько ссылок здесь на области newObstacle которые не выдают никаких ошибок

public static void generateObstacle(){

    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

    //randomly generates a 1 or 0
    switch(spawnObstacle.nextInt(2)){

        //if 0
        case 0:
            //newObstacle type is tree
            newObstacle.obstacleType = "TREE";
            break;

        //if 1
        case 1:
            //newObstacle type is rock
            newObstacle.obstacleType = "ROCK";
            break;

    }

    //randomly generates 0, 1, or 2
    switch(spawnObstacle.nextInt(3)){

        //if 0
        case 0:
            //newObstacle size is 1
            newObstacle.obstacleSize = 1;
            break;

        //if 1
        case 1:
            //newObstacleSize is 2
            newObstacle.obstacleSize = 2;
            break;

        //if 2
        case 2:
            //newObstacle size is 3
            newObstacle.obstacleSize = 3;
            break;

    }

}

и так далее. Тем не менее, внутри моего main(), я не могу сделать ссылку на какие-либо поля newObstacle или же newObstacle сам:

public static void main(String[] args){

    spawnPlayer();

    while(runGame){

        switch((playerInput.nextLine()).toUpperCase()){

            case "W": 
                for(int x = 0; x < allExistingObstacles.size(); x++){

                    if(newObstacle.obstacleXCoord == currentXCoord){                        

                    }                       
                }

привязка

newObstacle.obstacleXCoord

выдает ошибку и говорит

newObstacle не может быть преобразован в переменную

Почему я могу ссылаться на поля препятствий в другом месте моего кода, но не здесь?

5 ответов

Объем newObstacle ограничен функцией generateObstacle() так определите

 static Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

вне функции, так что ссылка (newObstacle) может находиться в глобальной области видимости и быть доступным для любой функции этого класса.

Также newObstacle должно быть static чтобы быть доступным внутри статических методов благодаря @chrylis за указание на это.

Это потому, что экземпляр существует только внутри области действия метода generateObstacle

public static void generateObstacle(){

    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);

Поэтому вне этого метода переменная: newObstacle не видна.

Я думаю, вам нужно вернуть этот экземпляр

public static Obstacle generateObstacle(){
  // ...
  return newObstacle;
}

Вы создали объект для Obstacle класс внутри generateObstacle(), Таким образом, область действия объекта находится внутри метода.

Вы не можете использовать его для ссылки на переменную вне блока, где она была объявлена

В generateObstacle это работает, потому что у вас есть Obstacle newObstacle = new Obstacle(null, 0, 0, 0); в начале метода.

Вы main недостаток этого.

Проблема в том, что newObstacle в main контекст не был инициализирован.

Вам нужно присвоить его результату generateObstacle:

public static void main(String[] args){
    Obstacle newObstacle = generateObstacle();
    // ...
}

И ваш generateObstacle Метод должен вернуть препятствие:

public static void generateObstacle() {
    Obstacle newObstacle = new Obstacle(null, 0, 0, 0);
    // ...
    return newObstacle;
}
Другие вопросы по тегам