command-line demo app
main

It is not considered good practice to just catch every possible exception like this. You should always specify which exceptions are possible and should be catched. In this specific case, the try-catch-statement is not necessary at all, because you are catching all possible exceptions in demoLoop already:

public static void main(String[] args) {
    demoLoop();
}


demoLoop

Are you trusting the user with making correct inputs? If the user does enter a String instead of a number, your program will crash. You can solve this problem by using the following snippet:

private static void demoLoop() {
    Scanner scanner = new Scanner(System.in);
    showOptions();
    int option;
    while(true) {
        try {
            option = scanner.nextInt();
            if(option &gt; 2 || option &lt; 0) {
                throw new InputMismatchException();
            }
            break;
        }
        catch(InputMismatchException e) {
            System.out.println("Enter 0, 1 or 2!");
            scanner.nextLine();
        }
    }
}


(don't forget to import java.util.InputMismatchException;)

I also don't like the way how you use the switch-case-statement, but this is probably just a matter of taste. I prefer the standard way:

switch (option) {
    case 0 : 
        System.exit(0);
        break;
    case 1 : 
        showDesignPrinciples();
        break;
    case 2 : 
        runDuckSimulator();
        break;
    default : 
        System.err.println("Please select a valid option.");
}