Title: Exception Handling
1Chapter 14
2Chapter Goals
- To learn how to throw exceptionsÂ
- To be able to design your own exception classes
- To understand the difference between checked and
unchecked exceptions - To learn how to catch exceptionsÂ
- To know when and where to catch an exception
3Error Codes
- Traditional approach to error handling method
returns error code - Example JOptionPane.showInputDialog returns null
if user hits Cancel - Problem Calling method may forget to check for
error code - Problem Calling method may not know how to fix
error--then it needs to return an error code - Symptom Programming for successx.doSomething()i
s replaced by programming for failureif
(!x.doSomething()) return false
4Exceptions
- Can't be overlooked
- Can be handled by a competent handler, not
necessarily the calling method - Throw an exception object to indicate failureif
(failure)Â Â XxxException e new
XxxException(. . .)Â Â throw e - More conciselythrow new XxxException(. . .)
5Exceptions
public class BankAccount public void
withdraw(double amount) if (amount
gt balance) throw new
IllegalArgumentException( "Amount exceeds
balance") balance balance - amount
...
6Hierarchy of Exception Classes
7Syntax 14.1 Throwing an Exception
- Â throw exceptionObject
- Example
- Â throw new IllegalArgumentException()
- Purpose
- To throw an exception and transfer control to a
handler for this exception type
8Checked Exceptions
- Compiler checks that you are aware of the
exception - Generally used for errors that can happen even
in correct programs - IOException and its sublcasses are checked
exceptions - NullPointerException, ArrayIndexOutOfBoundsExcep
tion , ... are unchecked --they are your fault
-) - Virtual machine errors (e.g. OutOfMemoryError)
are unchecked - Classification not perfect. For example,
Integer.parseInt throws unchecked
NumberFormatException - Checked exceptions are subclasses of Exception
that are not subclasses of RuntimeException
9Checked and Unchecked Exceptions
10Exception Specifications
- BufferedReader.readLine may throw IOException
- Tag calling method with throws IOException
- public class Coin
- public void read(BufferedReader in) throws
IOException - value Double.parseDouble(in.readLine())
name in.readLine() - ...
-
11Exception Specifications
- Need to tag caller of Coin.read as well
- Stop at main or with handler (see below)
- Can have multiple exception typespublic void
read() Â Â throws IOException, ClassNotFoundExcept
ion - throws specifier not a sign of irresponsible
programming - Better to declare exception than to handle it
incompetently
12Syntax 14.2 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 a
method can throw
13Designing Your Own Exception Types
- if (amount gt balance) Â Â throw new
InsufficientFundsException(. . .) - Make it an unchecked exception--programmer could
have avoided it by calling getBalance first - Extend RuntimeException
- Supply two constructors
14Designing Your Own Exception Types
previous start next
File Purse.java
public class InsufficientFundsException extends
RuntimeException public InsufficientFundsEx
ception() Â public
InsufficientFundsException(String reason)
super(reason)
previous start next
15Catching Exceptions
try BufferedReader in new
BufferedReader( new
InputStreamReader(System.in))
System.out.println("How old are you?")
String inputLine in.readLine() int age
Integer.parseInt(inputLine) age
System.out.println("Next year,you'll be "
age) catch (IOException exception)
System.out.println("Input/output error
exception) catch (NumberFormatException
exception) System.out.println("Input
was not a number")
16Catching Exceptions
- 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
to the calling method - If main doesn't catch an exception, the program
terminates with a stack trace
17Syntax 14.3 General Try Block
- try statement statement ...
catch (ExceptionClass exceptionObject)
statement statement ... catch
(ExceptionClass exceptionObject) statement
statement ......
18- Example
- Â try System.out.println("What is your
name?") String name console.readLine()
System.out.println("Hello,"name "!")
catch (IOException exception)
exception.printStackTrace() System.exit(1)
- Purpose
- To execute one or more statements that may
generate exceptions. If an exception of a
particular type occurs, then stop executing those
statements and instead go to the matching catch
clause. If no exception occurs, then skip the
catch clauses.
19The finally Clause
- Exception terminates current method
- Danger Can skip over essential code
- Example BufferedReader in in new
BufferedReader(new FileReader(filename))
purse.read(in) in.close()Â - Must execute in.close() even if exception happens
- Use finally clause for code that must be executed
"no matter what"
20The finally Clause
- BufferedReader in null try in new
BufferedReader( new FileReader(filename))
purse.read(in) finally if (in !null)
in.close()
21The finally Clause
- Executed when try block comes to normal end
- Executed if a statement in try block throws an
exception, before exception is thrown out of try
block - Can also be combined with catch clauses
22Syntax 14.4 The finally Clause
-  try   statement   statement   ...
finally -   statement   statement   ...
23previous start next
- Example
- Â BufferedReader in null
- try
- in new BufferedReader( new
FileReader(filename)) purse.read(in) -
- Finally
- if (in !null) in.close()
-
- Purpose
- To execute one or more statements that may
generate exceptions, and to execute the
statements in the finally clause whether or not
an exception occured.Â
24A Complete Example
- ProgramÂ
- reads coin descriptions from file
- Â adds coins to purse
- prints total
- What can go wrong?
- File might not exist
- File might have data in wrong format
- Who can detect the faults?
- main method of PurseTest interacts with user
- main method can report errors
- Other methods pass exceptions to caller
25The read method of the Coin class
- Distinguishes between expected and unexpected end
of file - public boolean read(BufferedReader in) throws
IOException - String input in.readLine() if (input
null) // normal end of file return false
value Double.parseDouble(input) // may
throw unchecked NumberFormatException name
in.readLine() if (name null) // unexpected
end of file throw new EOFException("Coin
name expected") return true
26The read method of the Purse class
- Unconcerned with exceptions
- Just passes them to caller
- public void read(BufferedReader in) throws
IOException - boolean done false while
(!done) Coin c new Coin() if
(c.read(in)) add(c) else done true
27The readFile method of the Purse class
- finally clause closes files if exception happens
- public void readFile(String filename) throws
IOException -
- BufferedReader in null try in
new BufferedReader( new FileReader(filename))
read(in) finally if
(in ! null) in.close()
28User interaction in main
- If an exception occurs, user can specify
another file name -
- boolean done false
- String filename JOptionPane.showInputDialog(
"Enter file name") while (!done)
try Purse myPurse new Purse()
myPurse.readFile(filename) System.out.print
ln("total" myPurse.getTotal()) done
true
29 catch (IOException exception)
System.out.println("Input/output error "
exception) catch (NumberFormatException
exception) exception.printStackTrace()
// error in file format if (!done)
Filename JOptionPane.showInputDialog("Try
another file") if (filename null)
done true
30Scenario
- PurseTest.main calls Purse.readFile
- Purse.readFile calls Purse.read
- Purse.read calls Coin.read
- Coin.read throws an EOFException
- Coin.read has no handler for the exception and
terminates immediately. - Purse.read has no handler for the exception and
terminates immediately - Purse.readFile has no handler for the exception
and terminates immediately after executing the
finally clause and closing the file. - PurseTest.main has a handler for an IOException ,
a superclass of EOFException. That handler prints
a message to the user. Afterwards, the user is
given another chance to enter a file name. Note
that the statement printing the purse total has
been skipped.
31File PurseTest.java
- 1 import javax.swing.JOptionPane
- 2 import java.io.IOException
- 3
- 4 /
- 5 This program prompts the user to enter a
file name - 6 with coin values. A purse object is filled
with - 7 the coins specified in the file. In case of
an exception, - 8 the user can choose another file.
- 9 /
- 10 public class PurseTest
- 11
- 12 public static void main(String args)
- 13
- 14 boolean done false
- 15 String filename
- 16 JOptionPane.showInputDialog("Enter
file name") - 17
32- 18 while (!done)
- 19
- 20 try
- 21
- 22 Purse myPurse new Purse()
- 23 myPurse.readFile(filename)
- 24 System.out.println("total"
myPurse.getTotal()) - 25 done true
- 26
- 27 catch (IOException exception)
- 28
- 29 System.out.println("Input/output
error " exception) - 30
- 31 catch (NumberFormatException
exception) - 32
- 33 exception.printStackTrace()
- 34
- 35
- 36 if (!done)
33- 38 filename JOptionPane.showInputDia
log( - 39 "Try another file")
- 40 if (filename null) done true
- 41
- 42
- 43 System.exit(0)
- 44
- 45
34File Purse.java
- 1 import java.io.BufferedReader
- 2 import java.io.FileReader
- 3 import java.io.IOException
- 4
- 5 /
- 6 A purse computes the total of a collection
of coins. - 7 /
- 8 public class Purse
- 9
- 10 /
- 11 Constructs an empty purse.
- 12 /
- 13 public Purse()
- 14
- 15 total 0
- 16
- 17
35- 18 /
- 19 Read a file with coin descriptions and
adds the coins - 20 to the purse.
- 21 _at_param filename the name of the file
- 22 /
- 23 public void readFile(String filename)
- 24 throws IOException
- 25
- 26 BufferedReader in null
- 27 try
- 28
- 29 in new BufferedReader(new
FileReader(filename)) - 30 read(in)
- 31
- 32 finally
- 33
- 34 if (in ! null) in.close()
- 35
- 36
36- 38 /
- 39 Read a file with coin descriptions and
adds the coins - 40 to the purse.
- 41 _at_param in the buffered reader for
reading the input - 42 /
- 43 public void read(BufferedReader in)
- 44 throws IOException
- 45
- 46 boolean done false
- 47 while (!done)
- 48
- 49 Coin c new Coin()
- 50 if (c.read(in))
- 51 add(c)
- 52 else
- 53 done true
- 54
- 55
- 56
37- 58 Add a coin to the purse.
- 59 _at_param aCoin the coin to add
- 60 /
- 61 public void add(Coin aCoin)
- 62
- 63 total total aCoin.getValue()
- 64
- 65
- 66 /
- 67 Get the total value of the coins in the
purse. - 68 _at_return the sum of all coin values
- 69 /
- 70 public double getTotal()
- 71
- 72 return total
- 73
- 74
- 75 private double total
- 76
38File Coin.java
- 1 import java.io.BufferedReader
- 2 import java.io.EOFException
- 3 import java.io.IOException
- 4
- 5 /
- 6 A coin with a monetary value.
- 7 /
- 8 public class Coin
- 9
- 10 /
- 11 Constructs a default coin.
- 12 Use the read method to fill in the value
and name. - 13 /
- 14 public Coin()
- 15
- 16 value 0
- 17 name ""
39- 18
- 19
- 20 /
- 21 Constructs a coin.
- 22 _at_param aValue the monetary value of the
coin. - 23 _at_param aName the name of the coin
- 24 /
- 25 public Coin(double aValue, String aName)
- 26
- 27 value aValue
- 28 name aName
- 29
- 30
- 31 /
- 32 Reads a coin value and name.
- 33 _at_param in the reader
- 34 _at_return true if the data was read,
- 35 false if the end of the stream was
reached - 36 /
40- 38 throws IOException
- 39
- 40 String input in.readLine()
- 41 if (input null) return false
- 42 value Double.parseDouble(input)
- 43 name in.readLine()
- 44 if (name null)
- 45 throw new EOFException("Coin name
expected") - 46 return true
- 47
- 48
- 49 /
- 50 Gets the coin value.
- 51 _at_return the value
- 52 /
- 53 public double getValue()
- 54
- 55 return value
- 56
41- 58 /
- 59 Gets the coin name.
- 60 _at_return the name
- 61 /
- 62 public String getName()
- 63
- 64 return name
- 65
- 66
- 67 private double value
- 68 private String name
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76