Целесообразность использования утверждения
Здравствуйте, я нашел вопрос, связанный с утверждением. Он спрашивает, какие строки правильно использовали операторы утверждения.
23. int =5;
24.
25. public void stuff1(int x){
26. assert(x>0);
27. switch(x){
28. case 2:x=3;
29. default:assert false;
}
}
30.
31. private void stuff2(int y){
assert(y<0);
}
32.
33. private void stuff3(){
assert(stuff4());
}
34.
35. private boolean stuff4(){
z=6;
return false;
}
Правильный ответ: "Утверждения утверждения в строках 29 и 31 используются надлежащим образом".
Но я чувствую, что использование assert в строке 29 бесполезно, поскольку всегда выдает ошибку утверждения. Если x равен 2, по умолчанию будет выполнено задание, которое выдаст ошибку подтверждения. Почему ответ говорит, что он правильно использовал утверждение в строке 29. Пожалуйста, кто-нибудь объяснит мне.
И также я чувствую, что утверждение в строке 33 не будет присвоено, так как снова вызов метода stuff4() всегда будет возвращать false, а утверждение всегда будет false. Это правильно?
3 ответа
Утверждать (ложь) в порядке. Это машиночитаемая версия комментария
// should never be reached
Я всегда думаю об утверждениях как машиночитаемых (и обязательных) комментариях
assert(stuff4()) отличается. Похоже, что он проверяет возвращаемое значение вещи4. Это плохо, так как в не отладочных сборках не будет вызываться stuff4 (для большинства реализаций assert); как правило, макрос assert не компилируется в не отладочных сборках
Утверждение в строке 29 утверждает, что любое другое значение, отличное от 2 для x, недопустимо, в общем случае в блоке переключателей оно гарантирует, что только определенные случаи являются действительными, а случай по умолчанию - нет.
Утверждение в строке 33 не подходит, потому что оно зависит от результата метода, который не используется для проверки, так что да, вы правы.
Согласно правилам утверждений, вы не можете использовать утверждение для проверки аргументов открытых методов, поэтому здесь утверждение в строке 26 не подходит.
Мы также можем использовать утверждение в месте, где поток не должен идти, или, скажем, для случаев, которые никогда не должны происходить. Итак, здесь поток не должен идти в случае по умолчанию. (но, опять же, оператор break не существует, там будет AssertionError). Вот почему утверждение в строке 29 является уместным.
Утверждение в строке 31 используется правильно для проверки аргумента частного метода.
Утверждение в строке 33 не подходит, поскольку оно не оставляет программу в том же состоянии, в котором она находилась до подтверждения. Если утверждение отключено, он не будет запускать код.