220 likes | 229 Views
Lecture 10: Programming Exceptionally. David Evans http://www.cs.virginia.edu/evans. CS201j: Engineering Software University of Virginia Computer Science. Last Time…. No checking Assume programmers know what they are doing Run-time checking
E N D
Lecture 10: Programming Exceptionally David Evans http://www.cs.virginia.edu/evans CS201j: Engineering Software University of Virginia Computer Science
Last Time… • No checking • Assume programmers know what they are doing • Run-time checking • Check for anomalous behavior during program execution • Static checking • Check at compile-time • Know properties of all possible executions before executing code CS 201J Fall 2003
Exceptions in Java CS 201J Fall 2003
StringSet choose public class StringSet { Vector els; // a Vector of String objects //@invariant els != null //@invariant els.elementType == \type(String) //@invariant els.containsNull == false … public String choose () // EFFECTS: Returns an element of this. { return (String) els.firstElement (); } } CS 201J Fall 2003
What can go wrong… public static void test () { StringSet s = new StringSet (); s.insert ("Alpha"); s.remove (s.choose ()); s.remove (s.choose ()); } > java TestClient Exception in thread "main" java.util.NoSuchElementException at java.util.Vector.firstElement(Vector.java:450) at StringSet.choose(StringSet.java:54) at TestClient.test(TestClient.java:22) at TestClient.main(TestClient.java:4) CS 201J Fall 2003
public class StringSet { Vector els; // a Vector of String objects //@invariant els != null //@invariant els.elementType == \type(String) //@invariant els.containsNull == false … public String choose () // REQUIRES: this has at least one element // EFFECTS: Returns an element of this. { return (String) els.firstElement (); } } CS 201J Fall 2003
Use Exceptions to Remove Requires public String choose () throws EmptyException // EFFECTS: If this has at least one // element, returns an element of this. // Otherwise, throws EmptyException. CS 201J Fall 2003
Throwing Exceptions public String choose () throws EmptyException // EFFECTS: If this has at least one element, returns an // element of this. Otherwise, throws EmptyException. { if (size () == 0) throw new EmptyException (); return (String) els.firstElement (); } What is EmptyException? CS 201J Fall 2003
Exceptions are Objects public class EmptyException extends Exception { public EmptyException () { super (); } } Exception EmptyException extends Exception means EmptyException inherits from the Exception type (in the Java API). We will cover subtyping and inheritance next week. CS 201J Fall 2003
Catching Exceptions public class SetClient { public static void test () { StringSet s = new StringSet (); s.insert ("Alpha"); try { s.remove (s.choose ()); s.remove (s.choose ()); } catch (EmptyException e) { System.err.println ("Got EmptyException!"); System.exit (1); } System.out.println (“Done”); } } Code inside the try block executes normally until it throws an exception. If no exception is thrown, execution proceeds after the catch. If the EmptyException exception is thrown, the catch handler runs. CS 201J Fall 2003
Propagating Exceptions public class StringSet { public String choose () { return (String) els.firstElement (); } } throws Vector.firstElement NoSuchElementException looking for catch handler public class SetClient { public static void main (String []args) { StringSet s = new StringSet (); s.insert ("Alpha"); s.remove (s.choose ()); s.remove (s.choose ()); System.out.println (“Done”); } } StringSet.choose looking for catch handler calls SetClient.main looking for catch handler Exception in thread "main" java.util.NoSuchElementException at java.util.Vector.firstElement(Vector.java:450) at StringSet.choose(StringSet.java:54) at SetClient.main(SetClient.java:6) CS 201J Fall 2003
Checked Exceptions • Java has two types of exceptions: checked exceptions and run time exceptions • Checked exceptions must be caught • Java compiler will not allow a program that could have an unchecked checked exception (so they don’t propagate to caller) • Run time exceptions need not be caught • Subtype of RuntimeException • Propagate automatically up stack until caught CS 201J Fall 2003
Catching Exceptions public class SetClient { public static void main (String args[]) { StringSet s = new StringSet (); s.insert ("Alpha"); System.out.println (s.choose ()); } } > javac SetClient.java SetClient.java:5: unreported exception EmptyException; must be caught or declared to be thrown CS 201J Fall 2003
Guidelines • Use unchecked exceptions when the exception is not part of the client interface: • Specified precondition is violated • Defensive programming • Assertion violated • Use checked exceptions when: • An unusual situation prevents the implementation from satisfying the normal postcondition CS 201J Fall 2003
Does Java API follow our guidelines? public final Object firstElement() // EFFECTS: If this vector has no elements, throws // NoSuchElementException. Otherwise, returns // the first component of this vector. public class StringSet { Vector els; // a Vector of String objects public String choose () // EFFECTS: Returns an element of this. { return (String) els.firstElement (); } } NoSuchElementException is a Runtime Exception, so there is no compiler warning for choose. CS 201J Fall 2003
Pop Quiz! CS 201J Fall 2003
Specifying Exceptional Behavior • Checked exceptions are part of the client interface: should be specified • ESC/Java exsures annotation: //@ensures N //@exsures (ExceptionType) E If the procedure returns normally, the postcondition N is true. If the procedure throws an exception of type ExceptionType, E is true. CS 201J Fall 2003
Specifying Choose public String choose () throws EmptyException //@ensures \result != null //@exsures (EmptyException) numEntries == 0 { if (size () == 0) throw new EmptyException (); return (String) els.firstElement (); } CS 201J Fall 2003
Exceptions Considered Harmful • Interfaces are more complicated – caller needs to worry about possible exceptions as well as result • Makes it harder to understand programs • Control flow jumps around like a goto CS 201J Fall 2003
PS2 AverageLength public class AverageLength { public static void main (/*@non_null@*/ String args[]) throws RuntimeException { String filename = args[0]; try { FileInputStream infile = new FileInputStream (filename); StringTable names = new StringTable (infile); int numnames = names.size (); int totallength = 0; for (int index = 0; index <= numnames; index++) { String name = names.getNthLowest (index); totallength = totallength + name.length (); } System.out.println ("The average name length is: " + (double) totallength / numnames); } catch (FileNotFoundException e) { System.err.println ("Cannot find file: " + filename); System.exit (1); } } } CS 201J Fall 2003
Exceptions Considered Helpful • Provide a way to deal with abnormal conditions • Better than returning “special” values since caller may forget to check for them • Allow you to deal with errors (e.g., file not found) up the call stack where more context information is available • Separate normal code from error handling CS 201J Fall 2003
Charge • PS4 Design Documents due today • In Section Friday, you will discuss your design with another team • Similarities and differences • What is better/worse about each design • What will make it more/less difficult to implement correctly CS 201J Fall 2003