COMP 121 Week 5
Download
Report
Transcript COMP 121 Week 5
COMP 121
Week 5: Exceptions and
Exception Handling
Objectives
To learn how to throw exceptions
To understand the difference between
checked and unchecked exceptions
To learn how to catch exceptions
To know when and where to catch an
exception
To learn how to create your own exception
classes
Error Handling
Traditional
approach -- Method returns
a value to indicate success or failure
The
calling method may not check return
value
Failure
notification may go undetected
The
calling method may not be able to do
anything about failure
Calling
method must fail, too, and let its
caller worry about it
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Error Handling
Instead of programming for success:
x.doSomething();
You are always programming for failure:
if (!x.doSomething()) return false;
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Java Solution: Exceptions
Exceptions
Can't
be overlooked
Are sent directly to an exception handler – not
just the caller of failed method
To signal an exceptional condition, use
throw statement to throw an exception
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Exception Example
public void withdraw(double amount)
{
if (amount > balance)
{
IllegalArgumentException exception
= new IllegalArgumentException("Amount exceeds balance");
throw exception;
}
balance = balance - amount;
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Throwing Exceptions
No need to store exception object in a
variable:
throw new IllegalArgumentException("Amount exceeds balance");
When an exception is thrown, the method
that threw the exception terminates
immediately
Execution
continues with an exception
handler
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Hierarchy of Exception Classes
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Checked and Unchecked Exceptions
Checked Exceptions
Compiler
checks that you take care of a checked
exception if you call a method that throws one
Due to external circumstances that the
programmer cannot prevent
Majority occur when dealing with input and
output
A checked exception is not a subclass of
RuntimeException or Error
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Checked and Unchecked Exceptions
Unchecked Exceptions
Compiler does not check that you take
care of an unchecked exception if you
call a method that throws one
Due
to circumstances that the programmer
can prevent
An unchecked exception is a subclass of
RuntimeException or Error
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Checked and Unchecked Exceptions
Categories aren't perfect:
Scanner.nextInt
throws unchecked
InputMismatchException
Programmer
cannot prevent users from
entering incorrect input
Majority of checked exceptions deal with
input and output (files and streams)
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Checked and Unchecked Exceptions
For example, use a Scanner to read a file
String filename = . . .;
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
FileReader constructor can throw a
FileNotFoundException (checked
exception)
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Options for Checked Exceptions
Two choices:
Handle
the exception
Tell compiler that you want the method to be
terminated when the exception occurs
Your method doesn’t handle the exception, so it
throws the exception up to its caller
Use throws specifier when method can throw a
checked exception
public void read(String filename) throws FileNotFoundException
{
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
. . .
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Options for Checked Exceptions
A single method can throw multiple exceptions
Use
throws with exception separated by commas:
public void read(String filename)
throws IOException, ClassNotFoundException
Keep in mind the inheritance hierarchy:
method can throw an IOException and
FileNotFoundException, only use IOException
(superclass of FileNotFoundException)
If
Better to throw an exception you don’t know how
to handle than handle it incorrectly or
incompletely
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Catching Exceptions
Install an exception handler with
try/catch statement
try block contains statements that may
cause an exception
catch clause contains the handler for a
certain type of exception
May have multiple catch clauses for the
different types of exceptions
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Example of Catching Exceptions
try
{
String filename = . . .;
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
String input = in.next();
int value = Integer.parseInt(input);
. . .
}
catch (IOException exception)
{
exception.printStackTrace();
}
catch (NumberFormatException exception)
{
System.out.println("Input was not a number");
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
General try/catch Syntax
try
{
statement
statement
. . .
}
catch (ExceptionClass exceptionObject)
{
statement
statement
. . .
}
catch (ExceptionClass exceptionObject)
{
statement
statement
. . .
}
. . .
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Catching Exceptions
Statements in try block are executed
If no exceptions occur, catch clauses are skipped
If an exception matching a caught type occurs, execution
jumps to catch clause that matches
After the catch block is executed, the method continues with
the code after the entire try/catch statement
If exception that doesn’t match a caught type occurs, it is
thrown until it is caught by another try block (try
blocks can be nested)
If an exception is not caught, it eventually will terminate
the program
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Catch Block
catch (ExceptionClass exception)
ExceptionClass
is the actual type (class name)
of the exception being caught
exception contains reference to the exception
object that was thrown
catch clause can analyze object to find out
more details
exception.printStackTrace()
Prints out the chain of method calls that led to the exception
exception.getMessage()
Retrieves the message string from the exception
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Flow of Control with try/catch
try {
// beginning of try block
Foo f = myobj.doSomething(); // doSomething may throw an exception
int x = f.getNum();
// will get here only if doSomething succeeded
}
// end of try block
catch (Exception ex) {
// beginning of catch
System.out.println(“doSomething failed”); // displayed if doSomething failed
ex.printStackTrace();
// displays stack
}
// end of catch block
System.out.printlin(“End of try/catch”); // No exception or caught exception
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Question:
How do you know what exceptions may be
thrown?
Answer:
Compile your code, and the compiler will let you
know (if it is a checked exception)
Read the javadoc!
Installed
file:///c:/Program%20Files/Java/jdk1.6.0/docs/api/index.html
Also
when Java was installed on the system
available on the Internet
http://java.sun.com/javase/6/docs/api/
Javadoc for Java Platform SE 6
Question: What exception(s) may be thrown
when a FileReader object is constructed?
Answer: FileNotFoundException
Question:What is the superclass
of FileNotFoundException?
Answer: IOException
The finally clause
Exception terminates current method
May
cause the JVM to skip over essential
code
Example:
PrintWriter out = new PrintWriter(filename);
writeData(out);
out.close(); // May never get here
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
The finally clause
Use optional finally clause for code
that must be executed no matter what
Once a try block is entered, the
statements in the finally clause are
guaranteed to execute whether an
exception is thrown or not
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
The finally clause
PrintWriter out = new
try
{
writeData(out);
}
finally
{
out.close();
//
//
//
PrintWriter(filename);
if an exception occurs, finally clause
is executed before exception is
passed to its handler. Also executed
// if no exception occurs.
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
The finally clause
try
{
statement
statement
. . .
}
finally
{
statement
statement
. . .
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
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 that
caught the exception, if one was thrown
When an exception was thrown in try block
and was not caught
After
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Designing Your Own Exception
Classes
You can design your own exception types–
subclasses of Exception or
RuntimeException
if (amount > balance)
{
throw new InsufficientFundsException(
"withdrawal of " + amount + " exceeds balance of
“ + balance);
}
It is an unchecked exception–programmer
could have avoided it by calling
getBalance and checking first
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Designing Your Own Exception
Classes
In your exception class
Extend RuntimeException or one of its
subclasses
Supply two constructors
1.
2.
Default constructor
A constructor that accepts a message string
describing reason for exception
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Designing Your Own Exception
Classes
public class InsufficientFundsException
extends RuntimeException
{
public InsufficientFundsException() {}
public InsufficientFundsException(String message)
{
super(message);
}
}
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Guidelines for Exceptions
To signal an exceptional condition, use the throw
statement to throw an exception object
Add a throws specifier to any method that can throw a
checked exception
It is better to declare that a method throws a checked exception
than to handle it poorly
Do not “squelch” exceptions by catching the exception and then
doing nothing
To handle an exception, put the code that can cause the
exception inside a try block, and put the handler code
inside the catch
Throw the most specific exception type you can
Only catch an exception if you know how to handle it
Design your own exception classes as subclasses of
Exception or RuntimeException only if the standard
exception types don’t adequately describe the error
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Summary
An exception is used to signal an error condition
When an exception is thrown, the current
method terminates immediately
There are two kinds of exceptions: checked and
unchecked
The
compiler checks that your program handles
checked exceptions
Unchecked exceptions extend the class
RuntimeException or Error
Statements that can cause an exception can be
put inside a try block
A catch clause is used to handle the exception
A finally clause is used for code that is guaranteed
to execute, whether or not an exception is thrown
Horstmann, C. (2008). Big Java (3rd ed.). New York: John Wiley & Sons.
Any Questions?