Подтвердить что ты не робот

Утверждение не работает

Я пытаюсь написать Assertion, чтобы проверить, является ли размер, который пользователь дает, является положительным значением, если не тогда сделать его положительным, этот оператор находится внутри конструктора класса, который принимает значение размера, а затем создает массив [size], Я написал код ниже, который я считаю правильным.

    public Grid(int size) {


    try{
        assert size > 0 ;
    }
    catch(AssertionError e){
        size = Math.abs(size);
    }

    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

Хотя я никогда, кажется, не оцениваю мое утверждение и не продолжает программу, то вызывает ошибку NegativeArraySize (которую я пытаюсь избежать)

Я также пробовал просто

assert size>0;

И программа не останавливается на отрицательные значения.

У меня было несколько проблем с запуском java на mac в последнее время, поэтому я не знаю, прав ли мой код, или если это всего лишь один из этих нечетных mac quirks!! и должен просто использовать

size=Math.abs(size);

Спасибо Сэм,

4b9b3361

Ответ 1

Вам нужно запустить свою программу с помощью переключателя -ea (включить утверждения), в противном случае JVM вообще не будет выполнять никаких инструкций assert. В зависимости от утверждений немного опасно. Я предлагаю вам сделать что-то вроде этого:

public Grid(int size) {
    size = Math.max(0, size) 
    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

Или даже так:

public Grid(int size) {
    if(size < 0) {
        throw new IllegalArgumentException("cannot create a grid with a negative size");
    } 
    setLayout(new GridLayout(size, size));
    grid = new JButton[size][size];
}

Второе предложение имеет преимущество, показывающее потенциальные ошибки программирования в других частях вашего кода, тогда как первый молча игнорирует их. Это зависит от вашего варианта использования.

Ответ 2

Утверждения могут быть включены или отключены при запуске программы и по умолчанию отключены.

См. Включение и отключение утверждений

Короче говоря, для включения утверждений во всех классах, кроме системных классов, используйте переключатель -enableassertions или -ea, когда вы запускаете свой класс.

Ответ 3

Так как assert - это новое ключевое слово Java, введенное в JDK 1.4, вам нужно скомпилировать программу с использованием компилятора JDK 1.4. Кроме того, вам необходимо включить в команду компилятора ключ-источник 1.4:

javac –source 1.4 AssertionDemo.java

ПРИМЕЧАНИЕ. Если вы используете JDK 1.5 или новее, нет необходимости использовать параметр -source 1.4 в команде.

По умолчанию утверждения во время выполнения отключены. Чтобы включить его, используйте переключатель -enableassertions или -ea, как показано ниже:

java –ea AssertionDemo

Утверждения могут быть выборочно включены или отключены на уровне уровня или уровне пакета. Переключатель отключен для -disableassertions или -da.

Например, следующая команда включает утверждения в пакет package1 и отключает утверждения в классе Class1.

java –ea:package1 –da:Class1 AssertionDemo

Утверждение не должно использоваться для замены обработки исключений. Обработка исключений связана с необычными обстоятельствами во время выполнения программы. Утверждения должны гарантировать правильность программы. Обработка исключений адресует правильность и достоверность адресов утверждений. Подобно обработке исключений, утверждения не используются для обычных тестов, а для внутренних согласований и проверок валидности.

Итак, лучший ответ - обработка исключений.

Не используйте утверждения для проверки аргументов в публичных методах. Допустимые аргументы, которые могут быть переданы общедоступному методу, считаются частью контракта методов. Контракт всегда должен выполняться, если утверждения включены или отключены. Например, приведенный выше код должен быть переписан с использованием обработки исключений