Я новичок в Java, работаю над небольшим проектом, и у меня возникла проблема, надеюсь, вы можете помочь:

Я пытаюсь создать двухмерный массив, в котором каждый элемент является объектом типа Field, который содержит x и y (как координаты элемента)

Я выкидываю ошибку, когда отправленные параметры для длины и ширины <0

Я тестирую свой код в основном методе, но всегда выдается ошибка, означающая, что метод для создания «карты» не получает правильные параметры.

Примечание: основной метод находится в другом классе (основном классе)

```

import bbb.MyException;

public class CoordinateSystem {

private int length;
private int width;
private Field[][] map = createMap(getWidth(), getLength());

public CoordinateSystem(int width, int length) throws MyException {
    this.width = width;
    this.length = length;
}

public int getLength() {
    return this.length;
}

public int getWidth() {
    return this.width;
}

public class Field{
    private int x;
    private int y;

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getY() {
        return y;
    }

}

public Field[][] getMap() {
    return map;
}

// Initializing a coordinate to each "field"
public Field[][] createMap(int width, int length) throws MyException {
    if(width > 0 && length > 0){
        Field[][] map = new Field[width][length];
        for( int i = 0 ; i < width ; i++ ){
            for( int j = 0 ; j < length  ; j++ ){
                map[i][j].setX(j);
                map[i][j].setY(i);
            }
        }
        return map;
    } else{
        throw new MyException("Sorry, can't create a field of width or height = 0 ");
    }
}

}

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

    CoordinateSystem board = new CoordinateSystem(8, 9);

    for( int i = 0 ; i < 8 ; i++ ){
        for( int j = 0 ; j < 9  ; j++ ){
            System.out.print(board.getMap()[i][j].getX());
            System.out.println(board.getMap()[i][j].getY());
        }
    }
    Exception in thread "main" bbb.MyException: Error! Sorry, can't create a 
    field of width or height = 0 
    at CoordinateSystem.createMap(CoordinateSystem.java:62)
    at CoordinateSystem.<init>(CoordinateSystem.java:9)
    at Main.main(Main.java:21)

    Process finished with exit code 1
2
Wassim Jaoui 29 Авг 2020 в 03:29

2 ответа

Лучший ответ

Эта строка вашего кода (в методе createMap()) ...

Field[][] map = new Field[width][length];

Создает двумерный массив, но каждый элемент в массиве имеет значение NULL.
Следовательно, эта строка вашего кода (также в методе createMap())

map[i][j].setX(j);

Бросит NullPointerException.

Вам необходимо явно создать объекты Field.
Также координата Y некоторых из элементов Field в map равна нулю, как и координата X в некоторых элементах, потому что (также в методе createMap()) вы запускаете {{ X4}} зацикливается с нулем. Чтобы исправить это, я добавляю один к i и j, когда вызываю setX() и setY().

Вот исправленный код для циклов for в методе createMap()

for( int i = 0 ; i < width ; i++ ){
    for( int j = 0 ; j < length  ; j++ ){
        map[i][j] = new Field();
        map[i][j].setX(j + 1);
        map[i][j].setY(i + 1);
    }
}

Осталось только вызвать метод createMap(). Поскольку map является членом класса CoordinateSystem, кажется логичным вызывать createMap() из конструктора CoordinateSystem.

public CoordinateSystem(int width, int length) throws MyException {
    this.width = width;
    this.length = length;
    map = createMap(width, length);
}

Наконец, для полноты, вот весь [исправленный] код класса CoordinateSystem

public class CoordinateSystem {

    private int length;
    private int width;
    private Field[][] map;

    public CoordinateSystem(int width, int length) throws MyException {
        this.width = width;
        this.length = length;
        map = createMap(width, length);
    }

    public int getLength() {
        return this.length;
    }

    public int getWidth() {
        return this.width;
    }

    public class Field {
        private int x;
        private int y;

        public void setX(int x) {
            this.x = x;
        }

        public int getX() {
            return x;
        }

        public void setY(int y) {
            this.y = y;
        }

        public int getY() {
            return y;
        }
    }

    public Field[][] getMap() {
        return map;
    }

    // Initializing a coordinate to each "field"
    public Field[][] createMap(int width, int length) throws MyException {
        if(width > 0 && length > 0){
            Field[][] map = new Field[width][length];
            for( int i = 0 ; i < width ; i++ ){
                for( int j = 0 ; j < length  ; j++ ){
                    map[i][j] = new Field();
                    map[i][j].setX(j + 1);
                    map[i][j].setY(i + 1);
                }
            }
            return map;
        }
        else{
            throw new Exception("Sorry, can't create a field of width or height = 0 ");
        }
    }

    public static void main(String[] args) throws MyException {
        CoordinateSystem board = new CoordinateSystem(8, 9);
        for( int i = 0 ; i < 8 ; i++ ) {
            for( int j = 0 ; j < 9  ; j++ ) {
                System.out.print(board.getMap()[i][j].getX());
                System.out.println(board.getMap()[i][j].getY());
            }
        }
    }
}
2
Abra 29 Авг 2020 в 01:56

Вы инициализируете map перед инициализацией width и height, поэтому getWidth() и getHeight() оба возвращают 0. Вы можете переместить инициализацию внутри конструктора и использовать там width и height:

public class CoordinateSystem {

    private int length;
    private int width;
    private Field[][] map;

    public CoordinateSystem(int width, int length) throws MyException {
        this.width = width;
        this.length = length;
        map = createMap(width, height);
    }

    // rest of the class...
0
Mureinik 29 Авг 2020 в 01:54