Проблема с заданием границ условий
Фрагмент кода игры ХО (Исходник)
Метод получения координаты от пользователя.
public class Point {
int x, y;
Point point;
Point() {
}
Point(int stroke, int column) {
x = stroke;
y = column;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public Point getPlayerCell() {
Scanner scanner = new Scanner(System.in);
Point point = new Point(-1,-1);
do {
System.out.println("Введите строку:");
int stroke = scanner.nextInt();
point.setX(stroke);
System.out.println("Введите столбец:");
int column = scanner.nextInt();
point.setY(column);
} while (((((point.getY() >= 0) & (point.getY() < field.gameSIZE)) & ((point.getX() >= 0) & (point.getX() < field.gameSIZE)))) & (field.checkPoint(point)));
return point;
}
Ожидается ввод координаты, проверка и постобработка полученной координаты.
Вопрос:
При введении значений координаты точки ЗА ГРАНИЦАМИ условий, указанных в в цикле do-while, происходит краш с NPE. Как изменить условие или ЧТО ДОБАВИТЬ в тело цикла, чтобы при превышении границ снова повторялся ввод ?
Ответы (1 шт):
Вы неправильно используете цикл, в вашем случае возвращение точки не зависит от самого цикла while, так как он не имеет тела, а только проверяет условия, с чем прекрасно справляется if.
Необязательно сначала создавать point, а потом перезаписывать поля X и Y, правильнее будет создавать новую точку сразу для необходимых координат. Также, вы упускаете ситуацию, когда пользователь может ввести вместо номера столбца/строки какой-либо другой символ, в примере ниже я использовал блок try catch для обработки этого случая. Возможно вы еще не знакомы с этим блоком и с темой обработок ошибок, в таком случае советую либо проигнорировать эту часть кода до момента изучения темы ошибок, либо же самостоятельно постараться разобраться зачем это нужно.
Приведенный ниже пример не является идеальным, он лишь поможет вам разобраться и понять возможное решение вашей задачи.
public Point getPlayerCell() {
try {
Scanner scanner = new Scanner(System.in);
System.out.println("Введите строку:");
int stroke = scanner.nextInt();
while (!(stroke >= 0 && stroke < field.gameSIZE)) {
System.out.println("Введите корректный номер строки:");
stroke = scanner.nextInt();
}
System.out.println("Введите столбец:");
int column = scanner.nextInt();
while (!(column >= 0 && column < field.gameSIZE)) {
System.out.println("Введите корректный номер столбца:");
column = scanner.nextInt();
}
Point point = new Point(stroke, column);
if (field.checkPoint(point)) {
return point;
} else {
System.out.println("Эта клетка уже занята, попробуйте другую");
return getPlayerCell();
}
} catch (InputMismatchException e) {
System.out.println("Необходимо вводить числа, попробуйте еще раз");
return getPlayerCell();
}
}