Wednesday, March 11, 2009

How to be assertive

  • Assertions were introduced in J2SE 1.4
  • Rather than introducing it as a class library it was built into the language itself using the keyword assert
  • Assertions can be used to test the following three roles:
    • Precondition - a condition that the caller of a method agrees to satisfy
    • Postcondition - a condition that the method itself promises to achieve
    • Invariant - a condition that should always be true for a specified segment or at a specified point of a program
  • An assertion has a boolean expression that if evaluated as false indicates a bug in the code
    assert a !=b  : "Not Equal!!"
  • The message part after the : is optional, if given it is passed to the stack trace which is printed
  • When an assertion fails, it means that the application has entered an incorrect state
  • When the expression evaluates to false an AssertionError is thrown
  • A good practice is to terminate the application when the error is thrown, because the application may start functioning inappropriately after a failure
  • Assertions are disabled by default - to run an application with assertions enabled we have to give the option "-ea" or "-enableassertion"
    java -ea AssertionTest
  • The above command enables assertion for all classes except for the system classes
  • To turn on assertion in system classes we have to use "-esa" or "-enablesystemassertions"
  • To disable assertions we have to use "-da" or "-disableassertion", which is the default
  • Also, we can enable or disable assertions for specific classes or packages
    java -ea:com.test.ui.UIClass MainClass
    java -ea:com.javacourses.tests... -da:com.javacourses.ui.phone MyClass
  • The ellipsis ... is part of the syntax
  • Following is a sample class that uses assertion to check for invalid user input
    import java.io.*;

    public class AssertionTest {
    public static void main(String[] args) throws IOException {
    System.out.print("Enter your marital status: ");
    int c = System.in.read();
    switch((char)c) {
    case 's': case 'S':
    System.out.println("Single");
    break;
    case 'm': case 'M':
    System.out.println("Married");
    break;
    case 'd': case 'D':
    System.out.println("Divorced");
    break;
    default:
    assert !true : "Invalid Option";
    }
    }
    }