Level 1: If there is an error, it will be caught at compile time. This is the next best case. Although it is possible to make a mistake, that mistake is guaranteed to be caught before you ever run the program. If your source code editor provides on-the-fly error checking, you may even be alerted to the mistake within seconds of making it.
Many recent developments in programming languages have been oriented toward allowing more errors to be caught at compile time. A good example is the generics facility added to Java in version 5.
Suppose you are creating an ArrayList to hold Strings. You do not intend that anything but Strings should ever be put into it, and you explicitly cast each element to a String as you remove it from the list. Nonetheless, prior to Java 5 there was nothing to prevent you from putting a different kind of object into the list. The result would be a ClassCastException when you removed it and tried to cast it to a String.
In Java 5, you can declare the list to be an ArrayList<String>. This informs the compiler that nothing but Strings may ever be put into the list. If you try to put anything else in, your code will fail to compile.