300 likes | 396 Views
Exceptions. Exceptions. Many problems in code are handled when the code is compiled, but not all Some are impossible to catch before the program is run Must run the program to actually determine the values of variables, get user input, etc.
E N D
Exceptions • Many problems in code are handled when the code is compiled, but not all • Some are impossible to catch before the program is run • Must run the program to actually determine the values of variables, get user input, etc. • These errors that occur when the program is running are “exceptions”
Exceptions • An exception is an object that describes an unusual or erroneous situation • Exceptions are generated by part of a program, and may be handled by another part of the program • A program can be separated into a normal execution flow and an exception execution flow • An error is also represented as an object in Java, but usually represents a unrecoverable situation and should not be caught
Exception Handling • Java has a predefined set of exceptions and errors that can occur during execution • A program can deal with an exception in one of three ways: • ignore it • handle it where it occurs • handle it an another place in the program • The manner in which an exception is processed is an important design consideration
Exception Handling • If an exception isn’t handled by the program, it halts and prints an error: Exception in thread “main” java.lang.NullPointerException at SomeClass.method(SomeClass.java:54) at Except.e2(Except.java:12) at Except.main(Except.java:22) • The error message gives the type of exception that was thrown (NullPointerException) • and the “stack trace”…
The Call Stack Trace • Indicates the line on which the exception occurred • (SomeClass.java:54) • Shows the method call trail that lead to the attempted execution of the offending line • main→ e2 → method
Tracing Problems • The call stack can be very long, and call methods in many libraries Exception in thread “main” java.util.UnknownFormatConversionException: Conversion = ‘i’ at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2603) at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2631) at java.util.Formatter.parse(Formatter.java:2477) at java.util.Formatter.format(Formatter.java:2411) at java.io.PrintStream.format(PrintStream.java:899) at java.io.PrintStream.printf(PrintStream.java:800) at Except.e3(Except.java:17) at Except.main(Except.java:22) • It can be tricky to find the “real” cause • should be the innermost code that isn’t fully tested
The Exception Class • In Java, exceptions are objects • There is a hierarchy of exception types, with Exception at the top • you don’t generally instantiate Exception; one is automatically created when there is an error • There are many subclasses of Exception that are used for particular types of errors
Exception Subclasses • The subclasses of Exception are types that more specifically identify the problem, e.g.: • ArithmeticException • most often caused by a divide-by-zero • IndexOutOfBoundsException • array/List/String index doesn’t exist • NoClassDefFoundError • .class file was there when compiling, but not there now • Tend to have informative names: useful errors
The Exception Class Hierarchy • All error and exception classes are descendents of the Throwable class • A programmer can define an exception by extending the Exception class or one of its descendants • The parent class used depends on how the new exception will be used
Catching Exceptions • We say that a certain block of code “throws” an exception • think: when the exception occurs, an exception object is generated and tossed at the interpreter • How do you handle something that is thrown at the interpreter? • you “catch” it • Uncaught exceptions stop the program… caught exceptions do not
The try Statement • To handle an exception in a program, the line that throws the exception is executed within a try block • A try block is followed by one or more catch clauses • Each catch clause has an associated exception type and is called an exception handler • When an exception occurs, processing continues at the first catch clause that matches the exception type
A try/catch sequence try { \\ execute the code that you find here } catch(Exception e) { \\ if the there is an exception \\ then you do the stuff in this part }
An Example try { int x; x = 10/0; } catch(Exception e) { System.out.println(“error occurred”); }
The Exception Parameter • The catch is a little like an else, and a little like a function definition • try {…} catch(Exception e) {…} • The argument (“exception parameter”) is assigned to an appropriate Exception object • In the divide-by-zero example, e will be an instance of ArithmeticException • The exception parameter’s value can be ignored if you don’t need to use it
Another Example try { int x; x = 10/0; } catch(ArithmeticException e) { System.out.println(“divided by 0”); }
Being Specific • Can have multiple catch blocks • The exception parameter type allows different types of exceptions to be handled differently
Being Specific try { int x = userin.nextInt(); System.out.println(10/x); } catch(ArithmeticException e) { System.out.println(“no zeroes”); } catch(InputMismatchException e) { System.out.println(“enter a number”); } Most likely causes
Being Specific • The exception parameter is matched like arguments in an overloaded function • The type of exception thrown is matched against the exception parameters • That class… or any subclass… will match • Examples: • Exception matches all exceptions • IndexOutOfBounds matches both array and string exceptions
The Catch All try { … a bunch of code, involving an integer x… System.out.println(10/x); } catch(ArithmeticException e) { System.out.println(“no zeroes”); } catch(Exception e) { System.out.println(“some other problem”); }
However… • In general, use a type as specific as possible • only catch the exceptions you want to catch and handle properly • Don’t incorrectly handle other problems • the catch-all hides problems you might want to know about • Other exceptions are propogated • they can be caught farther up the call stack
Exception Propagation • An exception can be handled at a higher level if it is not appropriate to handle it where it occurs • Exceptions propagate up through the method calling hierarchy until they are caught and handled or until they reach the level of the main method • A try block that contains a call to a method in which an exception is thrown can be used to catch that exception
Checked versus Unchecked • An exception is either checked or unchecked • An unchecked exception does not require explicit handling, though it could be processed that way • The only unchecked exceptions in Java are objects of type RuntimeException or any of its descendants • Errors are similar to RuntimeException and its descendants in that: • Errors should not be caught • Errors do not require a throws clause
Checked Exceptions • Checked exceptions (other subclasses of Exception) must be handled explicitly • must be caught by a method in a catch block • must be listed in the throws clause of any method that might throw it • The compiler will issue an error if a checked exception is not caught or asserted in a throws clause
The throws Clause • Used to indicate that the method will “handle” the checked exception by passing it off to the calling code • Similarly, the calling code must either catch it or be declared indicating that it throws the exception public int myMethod() throws Exception1, Exception2 • Any uncaught checked exceptions must be listed in the throws clause
The throw Statement • When your code gets to a situation it can’t handle, it can throw an exception • e.g. constructor/setter given an illegal value • Create an instance of the appropriate exception class • new SomeException(“Error message”); • Throw the exception with a throw statement • throw new SomeException(“message”);
The throw Statement • The throw statement appears in the body of a method, with an appropriate throws clause • Usually a throw statement is executed inside an if statement that evaluates a condition to see if the exception should be thrown if(x<0) throw new NegativeInputException;
Example • From the Student class: public void setFirstName(String name) { if(name.length()>0) firstName = name; else throw new IllegalArgumentException (“Name must have length >0”); }
The finally Clause • A try statement can have an optional clause following the catch clauses, designated by the reserved word finally • The statements in the finally clause always are executed • If no exception is generated, the statements in the finally clause are executed after the statements in the try block complete • If an exception is generated, the statements in the finally clause are executed after the statements in the appropriate catch clause complete
Why use finally ? • To make sure that a certain part of an algorithm are executed • To leave objects in a stable state • e.g. An object representing a database connection might be disconnected when an error occurs • … there are good security reasons for doing this