Попробую использовать в качестве примера программу, вычисляющую расстояние между двумя точками.
Давайте представим, что у меня есть файл Client.java (с классом Client), в котором считываются входные данные и куда мы помещаем System.out.println для записи выходных данных (координаты точки A и координаты точки B), это файл будет выглядеть так:
import java.util.Scanner;
public class Cliente {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Ponto a = new Ponto(sc.nextDouble(), sc.nextDouble());
Ponto b = new Ponto(sc.nextDouble(), sc.nextDouble());
System.out.println((int) Math.floor(a.dist(b)));
sc.close();
}
}
И у меня есть еще один файл под названием Point.java (с классом Point), в этом файле я должен перед созданием объекта проверить, превышают ли координаты x или y для каждой точки 0, и только после того, как эта проверка будет выполнена, я собираюсь создайте точку, если какая-либо из точек отрицательна, она должна вывести «iv». Другими словами, код должен выглядеть примерно так:
class Ponto {
private double x, y;
check(x);
check(y);
public Ponto(double x, double y) {
this.x = x;
this.y = y;
}
public double dist(Ponto p) {
double dx = x - p.x;
double dy = y - p.y;
return Math.sqrt(dx * dx + dy * dy);
}
public static void check(double x, double y) {
if (x < 0 || y < 0) {
System.out.println("iv");
}
}
}
Я думал, что это будет сделано именно так, но эта «версия» выдает ошибки, а другие «версии», которые мне удалось сделать, объект всегда создавался перед проверкой... Может ли кто-нибудь объяснить, чего мне не хватает?
Примером ввода и вывода для этой задачи может быть:
0,0 0,0
2,0 2,0
Вывод: 2
Другой пример:
-1.0 1.0
-1.0 1.0
вывод: iv
Ваша проверка вызывается неправильно, и даже если она вызывается правильно, проверка на самом деле ничего не делает. Вы должны вызвать его в конструкторе и создать исключение для обработки. т.е. IllegalArgumentException
А еще check(x) vs check(double x, double y) — вы видите в этом проблему?
Конструкторы @ScaryWombat всегда выдают исключения, если проверяют параметры, поэтому объект не создается. Например new Integer("one") бросит NumberFormatException. Вы можете добавить статический метод для проверки параметров конструктора или фабричный метод, который будет возвращать null без исключения, но это все равно придется проверять, и Java заставит вас добавить эту проверку, если выдаст обычное проверенное исключение (почему Integer.parseInt(), который следует использовать вместо new Integer(...), все равно выдает исключение).




Конструктор должен быть коротким и понятным. Но проверка аргументов — вполне законная задача конструктора.
Выдать исключение недопустимого аргумента после проверки в конструкторе. В случае броска построение прерывается, экземпляр объекта не создается.
// Constructor
public Point ( final double x, final double y )
{
if ( x < 0 || y < 0 ) { throw new IllegalArgumentException( … ) ; }
this.x = x;
this.y = y;
}
Если проверка сложна, например, включает поиск в базе данных, вам следует использовать объект Builder для сбора и проверки входных данных перед созданием объекта основного класса.
Джакартская проверка может оказаться вам полезной.
Выполните проверку в конце конструктора.