2013-08-08 5 views
0

Я принимаю этот фрагмент кода от K & B практических экзаменов.Confusion - Assertion Соответствующее использование

public class Later { 
    public static void main(String[] args) { 
     boolean earlyExit = new Later().test1(args); 
     if (earlyExit) assert false; // LINE 5 
     new Later().test2(args); 
    } 
    boolean test1(String[] a) { 
     if (a.length == 0) return false; 
     return true; 
    } 
    private void test2(String[] a) { 
     if (a.length == 2) assert false; // LINE 13 
    } 
} 

Ответ в К & Б утверждает, что, ЛИНИЮ-5 И ЛИНИЯ-13 находятся в-надлежащее использование утверждений. Хотелось бы знать, почему. Вот мое наблюдение после прочтения темы утверждения из K & Б.

1.I понимают, LINE 5 является неуместным, поскольку она использует утверждение для проверки аргументов командной строки. Утверждения никогда не должны использоваться для проверки аргументов командной строки.

2. В ответ также говорится, что LINE 13 также является подходящим использованием утверждений. Хорошая практика в утверждениях утверждает, что вы можете использовать утверждения для проверки аргументов в ваших частных методах. Итак, мой вопрос в том, почему LINE 13 подходит для использования утверждений.

Любое понимание этого будет полезно.

+0

Я понятия не имею, о чем вы просите. Я думаю, вы должны переписать свой вопрос, чтобы быть более ясным. –

+0

Я повторно повторил свой вопрос, пожалуйста, взгляните и дайте мне знать, если это имеет смысл сейчас. – benz

ответ

1

Утверждение (assert ключевое слово в java) используется для проверки правильность инварианта в коде, предварительное условие или постусловие. Они используются для проверки вашего предположения в коде, чтобы поймать несогласованное состояние и, как правило, - индикатор ошибки или нежелательного выполнения потока.
Assertion отключен по умолчанию, потому что они не должны бросать в производстве и утверждавшего код не выполняется

public class AssertionTest {    
    private boolean productionCode(){ 
    System.out.println("Prodution code executed"); 
    return true; 
    } 

    private void assertion() { 
    assert productionCode(); 
    } 
} 

с утверждением позволили выходом:

Prodution code executed 

и с утверждением отключен output is ... ничего!так тщательно

Синтаксис:

  1. assert <boolean expression>; бросает AssertionError если ложна
  2. assert <boolean expression> : <expression with value> бросает AssertionError с подробным сообщением, если ложно

В вашей пример

private void test2(String[] a) { 
    if (a.length == 2) assert false; // LINE 13 
} 

вы используете его в неправильном направлении, так как правильный путь

private void test2(String[] a) { 
    assert (a.length != 2); 
} 

означает: a ДОЛЖЕН иметь lenght не равен 2 еще ошибка

Чтение here документации Oracle ,

+1

Я бы скорее сказал, что это означает «если a имеет длину == 2, то это ошибка», –

+0

@bellabax это объяснение имеет больше смысла для меня. Спасибо. – benz

+2

Ваш код неправильный, потому что он просто противоположный исходному коду. if (a.length == 2) assert false; // LINE 13 означает «если a имеет длину == 2, то это ошибка», но вы указали прямо противоположное в вашем «исправленном» коде. В любом случае то, что вы показали, является правильным использованием «assert», хотя оригинал все еще действителен java :) –

1

Утверждения используются для проверки инвариантов кода. Вы не должны делать проверку ввода с помощью утверждений, потому что обычно они отключены во время выполнения, поэтому LINE 5 не подходит.

Вопрос: Утверждение защищает, что мы можем использовать утверждение для проверки частных методов.

A: Да, вы можете проверить аргументы частного метода с утверждениями, потому что они не видны публике - то есть, если утверждение терпит неудачу, это означает, что ошибка логики/программистов где-то в вызывающем, но я бы рекомендовал используя конструкции if/else/exceptions. Как я уже говорил выше, вы никогда не должны проверять публичные методы, потому что на практике каждый может передать что-либо в этом методе, и если утверждения отключены, то будут иметь место плохие вещи :)

+0

Что конкретно вы подразумеваете под индексом кода? Но test2 можно использовать внутри и для проверки, а не обязательно для ввода командной строки. Validation.test2 также можно использовать и так далее, поэтому почему строка 13 неуместна? – benz

+0

Я имею в виду некоторые условия, которые всегда «истинны», если они не являются, чем вы ошиблись. http://en.wikipedia.org/wiki/Invariant_%28computer_science%29 –

+0

Я не понимаю, почему LINE 13 является ненадлежащим использованием. Мне жаль, но строка 13 все еще не имеет смысла для меня. – benz

Смежные вопросы