Утверждение не работает
Я пытаюсь написать 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);
Спасибо Сэм,
Ответы
Ответ 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
Утверждение не должно использоваться для замены обработки исключений. Обработка исключений связана с необычными обстоятельствами во время выполнения программы. Утверждения должны гарантировать правильность программы. Обработка исключений адресует правильность и достоверность адресов утверждений. Подобно обработке исключений, утверждения не используются для обычных тестов, а для внутренних согласований и проверок валидности.
Итак, лучший ответ - обработка исключений.
Не используйте утверждения для проверки аргументов в публичных методах. Допустимые аргументы, которые могут быть переданы общедоступному методу, считаются частью контракта методов. Контракт всегда должен выполняться, если утверждения включены или отключены. Например, приведенный выше код должен быть переписан с использованием обработки исключений