Утверждение не работает - PullRequest
27 голосов
/ 23 октября 2011

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

    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, поэтому я не знаю, правильный ли мой код или это одна из этих странных причуд !! и должен просто использовать

size=Math.abs(size);

Спасибо, Сэм,

Ответы [ 3 ]

49 голосов
/ 23 октября 2011

Вам нужно запустить вашу программу с ключом -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];
}

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

12 голосов
/ 23 октября 2011

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

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

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

2 голосов
/ 28 июля 2016

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

javac –source 1.4 AssertionDemo.java

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

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

java –ea AssertionDemo

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

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

java –ea:package1 –da:Class1 AssertionDemo

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

Так что в этом случае лучшим ответом будет обработка исключений.

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

...