CSE 501N Fall ‘06 02: Machine Overview + Fundamental Types

Download Report

Transcript CSE 501N Fall ‘06 02: Machine Overview + Fundamental Types

CSE 501N
Fall ’09
17: Exception Handling
03 November 2009
Nick Leidenfrost
Lecture Outline
Lab 6 Questions?
 Exceptions & Errors
 throws statement
 Exception Handling: try/catch blocks
 finally statement

2
Error Handling: Error Codes

Traditional approach:
 Method returns error code
public static final int NO_ERROR = 0;
public static final int BAD_INPUT = -1;
public static final int INVALID_STATE = -2;
// ...
public int doSomething (int someInput) {
if (!isValidInput(someInput))
return BAD_INPUT;
// ... Method body
return 0;
}
3
Error Handling: Error Codes

Problem: Caller is not forced to check for error code
 (Failure notification may go undetected)

Problem: Calling method may not be able to do
anything about failure
 Caller must also fail and let its caller worry about it
 Many method calls would need to be checked
 Lots of special logic would be introduced for
handling errors
4
Error Handling: Error Codes

Instead of programming for success:
int theAnswer = x.doSomething(0);

You would always be programming for
failure:
IntStorage answer = new IntStorage(0);
int errorCode = x.doSomething(0, answer);
if (errorCode != x.NO_ERROR) return errorCode;
5
Error Handling


Java provides two ways of dealing with
abnormal circumstances:
Exceptions
 “…
conditions that a … program might want to catch”
 Derived from java.lang.Exception

Errors
 “…
serious problems that a … program should not try
to catch”
 Derived from java.lang.Error
6
Throwing Exceptions

Exceptions:

Alter control flow to code intended to deal with the
problem:


Exception handlers
Can't be overlooked

Java compiler checks for existence of exception handlers

Throw an exception object to signal an exceptional
condition (or abnormal condition)

Method
execution is
Example:
IllegalArgumentException:
We throw
an
halted at this point and
exception with the
control flow is returned
throw
clause.
// illegal parameter
to the calling value
method.
Exception iaException
= new IllegalArgumentException(“Key cannot be null.");
throw iaException;
7
Throwing Exceptions

No need to store exception object in a
variable:
throw new IllegalArgumentException(“Key cannot be null.“);

When an exception is thrown, method
terminates immediately
 Execution
continues with an exception
handler which handles the type of exception
that was thrown
8
Example
public class HashMap {
public void put (Object key, Object value) {
if (key == null) {
IllegalArgumentException exception
= new IllegalArgumentException(“Key cannot
be null.“);
throw exception;
}
// ...
}
}
9
Types of Exceptions

Two types of exceptions:
 Checked

The compiler will check to make sure code exists
to handle the exception
 Unchecked
Usually arise in circumstances that would be
impossible for the compiler to predict
 A.k.a. Runtime exceptions
[ Eclipse Example ]

10
Hierarchy of Exception Classes
The Hierarchy of
Exception Classes
11
Checked vs. Unchecked Exceptions

Checked Exceptions
Usually due to external circumstances that the
programmer cannot prevent
 The compiler checks that you don't ignore them
outright



You must define exception handlers
Mainly occur when dealing with input and output

For example, IOException caused by File
manipulation, Networking, user input, etc.
12
Checked vs. Unchecked Exceptions

Unchecked Exceptions / Errors:
Extend the class RuntimeException or Error
 They are (usually) the programmer's fault
 Examples of runtime exceptions:

NullPointerException
ArrayIndexOutOfBoundsException
IllegalArgumentException

Example of error: OutOfMemoryError
13
Checked vs. Unchecked Exceptions

Categories aren't perfect:
 Scanner.nextInt throws unchecked
InputMismatchException
 Programmer cannot prevent users from entering
incorrect input
 This choice makes the class easy to use for
beginning programmers
[ Eclipse Scanner Example ]

Deal with checked exceptions principally when
programming with files and streams
 Coming up in a few lectures…
14
The throws clause


If an exception can be thrown, the compiler will
make sure our code acknowledges the exception
Two choices:
 Handle the exception in this method
 We’ll look at how to do this in a bit…
 Tell
compiler that you want method to be terminated
when the exception occurs

Use throws keyword to tell Java an exception may be
thrown inside the method body that is not handled
public void read(String filename) throws FileNotFoundException {
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
. . .
}
15
The throws clause

For multiple exceptions:
public void read(String filename)
throws IOException, ClassNotFoundException

Keep in mind inheritance hierarchy:
If method can throw an IOException and
FileNotFoundException, only use IOException

Better to declare exception than to handle it
incompetently
16
Syntax: Exception Specification
accessSpecifier returnType
methodName(parameterType parameterName, . . .)
throws ExceptionClass, ExceptionClass, . . .
Example:
public void read(BufferedReader in) throws IOException
Purpose:
To indicate the checked exceptions that this method can throw
17
Exception Handlers
Catching Exceptions
Write exception handlers with the
try/catch statement
 try block contains statements that may
cause an exception
 catch clause contains handler for an
exception type

18
Catching Exceptions: Syntax
try {
// Code that might cause Exceptions
}
catch (Exception exception) {
// Code to handle Exceptions
}
19
Catching Exceptions: control flow
Statements in try block are executed
 If no exceptions occur, catch clauses are
skipped
 If exception of matching type occurs,
execution jumps to catch clause


If exception of another type occurs, it is
thrown until it is caught by another
try/catch block
20
Catching Exceptions: the catch clause
catch (IOException exception) {
}
 exception
contains reference to the
exception object that was thrown
 catch clause can analyze object to find out
more details
 exception.printStackTrace(): printout
of chain of method calls that lead to exception
21
Catching Errors: the catch clause

It is possible to catch Errors, also.
try {
...
}
catch (Error error) {
}

Because Errors are typically indicative of more
serious problems, doing this is rare.
 Most
often, the program is allowed to terminate.
22
Syntax: Multiple catch clauses
try {
//
//
}
catch
//
//
}
catch
//
//
}
statement
. . .
(ExceptionClass exceptionObject) {
statement
. . .
(ExceptionClass exceptionObject) {
statement
. . .
23
Catching Multiple Types of Exceptions
Throws
java.lang.IOException
try {
String filename = “. . .”;
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
String input = in.next();
int value = Integer.parseInt(input);
. . .
Throws
}
java.lang.NumberFormatException
catch (Exception
(IOException
exception)
exception)
{ {
exception.printStackTrace();
}
catch (NumberFormatException exception) {
System.out.println("Input was not a number");
}
24
The finally clause

An uncaught exception terminates the
current method
-

! - This can skip over essential code
Example:
public void readSomeData () throws IOException {
FileReader reader =
Scanner input = new
readData(input);
reader.close(); //
new FileReader(filename);
Scanner(reader);
// Can throw an exception
May never get here
}
26
The finally clause

We want to execute reader.close()
even if an exception happens

Use finally clause for code that must
be executed "no matter what"
27
Example: The finally clause
FileReader reader = new FileReader(filename);
try {
Scanner in = new Scanner(reader);
readData(in);
}
catch (IOException ioe) {
// ...
}
finally {
reader.close(); // finally clause is executed regardless
// of whether exception occurs
}
28
Syntax: The finally clause
try {
// statements
}
finally {
// statements
}
// Notice that a try block can have a finally clause without a catch
// Why is this?
29
The finally clause

Executed when try block is exited in any of
three ways:
last statement of try block
 After last statement of catch clause, if this try block
caught an exception
 When an exception was thrown in try block and not
caught
 After

For any of these ways, the finally block
executes.
30
Designing Your Own Exception Types

You can design your own exception types–
subclasses of Exception or
RuntimeException
Unchecked
Exceptions
Checked
Exceptions
if (amount > balance) {
throw new InsufficientFundsException(
"withdrawal of " + amount + " exceeds balance of
“ + balance);
}
31
Designing Your Own Exception Types



Make it an unchecked exception–programmer
could have avoided it by calling getBalance
first
Extend RuntimeException or one of its
subclasses (InvalidParameterException)
Supply two constructors
1.
2.
Default constructor
A constructor that accepts a message string
describing reason for exception
32
Designing Your Own Exception
Types
public class InsufficientFundsException
public class InsufficientFundsException
extends RuntimeException {
extends RuntimeException {
public InsufficientFundsException() {}
public InsufficientFundsException() {}
}
}

public InsufficientFundsException (String message,
public InsufficientFundsException (String message) {
double shortage) {
super(message);
} super(message);
}
Your type can include additional
information needed to handle properly
33
Conclusion
Questions?
 Lab 6 Due Tonight at Midnight
 Lab 7 Assigned Today

 Due

11/10 at Midnight
Lab Now
34