comp 401 exceptions - computer sciencedewan/comp401/current/lectures/... · 2013. 11. 22. · java...
TRANSCRIPT
![Page 1: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/1.jpg)
COMP 401
EXCEPTIONS
Instructor: Prasun Dewan
![Page 2: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/2.jpg)
2
PREREQUISITE
Inheritance
Interfaces
Input
Iterator
![Page 3: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/3.jpg)
3
EXCEPTIONS: WHAT?
Exceptions have to do with error handling
Run time
Custom
Error kinds
Internal errors in a program (e.g. off –by-one)
External errors
User input
File system
Other distributed programs
![Page 4: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/4.jpg)
4
WHY STUDY ERROR HANDLING
Better user experience
Security
![Page 5: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/5.jpg)
5
WHY EXCEPTION SUPPORT FOR ERROR HANDLING
Error handing can be done without exceptions
Exceptions promote software engineering principles
on error handling
Easier to program
Efficiency
Separation of concerns (modularity)
Ease of change
Ease of understanding
Concerns and exceptions?
Non erroneous code
Erroneous code
![Page 6: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/6.jpg)
6
public class ArgPrinter { public static void main(String[] args) { System.out.println(args[0]); } }
ARGUMENT PRINTER
![Page 7: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/7.jpg)
7
CORRECT USAGE
What if the user does not enter an argument?
![Page 8: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/8.jpg)
8
package lectures.exceptions; public class ArgPrinter { public static void main(String[] args) { System.out.println(args[0]); } }
USER DOES NOT ENTER ARGUMENT: DEFAULT
EXCEPTION HANDLING
Type of exception (array index exception) reported to the user
Trace of all methods in the call chain (stack)
shown
Implies Java is checking each array element access for correct index (subscript checking) rather than simply
going to some unanticipated (valid or invalid) memory address. Core dumped in some languages when
hardware detects that memory address is out of range
Message understandable to
programmer but not user
![Page 9: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/9.jpg)
9
package lectures.exceptions; public class SafeArgPrinter { public static void main(String[] args) { if (args.length == 0) { System.out.println( "Did not specify the argument to be printed. Terminating program."); System.exit(-1); } else { System.out.println(args[0]); } } }
SAFE ARG PRINTER WITH ERROR CHECK
Regular and error code undifferentiated for reader
May want to ignore errors on first pass.
Java checks for subscript error.
Extra check
![Page 10: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/10.jpg)
10
package lectures.exceptions; public class ExceptionHandlingArgsPrinter { public static void main(String[] args) { try { System.out.println(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not specify the argument to be printed. Terminating program."); System.exit(-1); } } }
SAFE CODE WITH TRY-CATCH
Try-catch separates regular and error-handling code.
No extra subscript check
![Page 11: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/11.jpg)
11
MULTIPLE LINE ECHOER
Number of input lines, N, to be echoed given as argument
Programs echoes N input lines and terminates
Processing of program argument and user input in different methods
User may enter no argument
User may enter more than N lines?
User may enter less than N lines
Errors?
And enter the EOF character
User argument may be a non number
![Page 12: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/12.jpg)
12
CALL CHAINS AND EXCEPTIONS
public class LinesReaderAndPrinter { public static void main (String args[]) { echoLines(numberOfInputLines(args)); } … }
![Page 13: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/13.jpg)
13
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); } }
ERRONEOUS NUMBEROFINPUTLINES FUNCTION
Return value? Ignoring NumberFormalException to
simplify example
Multiple catch blocks can be associated with a try block
![Page 14: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/14.jpg)
14
ERROR RECOVERING NUMBEROFINPUTLINES
FUNCTION
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); return 0; } }
Error recovery: Program not halted
Caller should decide what to do
This caller of function want to assume 1 instead of 0
![Page 15: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/15.jpg)
15
ECHOLINES: GIVE UP
Decision to halt without full context
Maybe echoing fewer lines is ok for this caller and only a warning can be given or a confirmation can be asked from user.
static BufferedReader input =
new BufferedReader(
new InputStreamReader(System.in));
static void echoLines (int numberOfInputLines) {
try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
Caller should decide what to do
![Page 16: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/16.jpg)
16
MORAL: SEPARATE ERROR DETECTION AND
HANDLING
In this example
Let echoLines() and numberOfInputLines() not do the
error handling.
All they should do is error detection.
Main should handle error reporting and associated UI
![Page 17: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/17.jpg)
17
HOW TO PASS THE BUCK?
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); return 0; } }
![Page 18: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/18.jpg)
18
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { return -1; } }
PASSING THE BUCK: NUMBEROFINPUTLINES:
ERROR CODE
Caller can decide what to do Does not work if -1 was legal value
Does not work if function returned unsigned value (supported in some languages and simulatable in Java)
![Page 19: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/19.jpg)
19
HOW TO PASS THE BUCK FOR PROCEDURE?
static BufferedReader input =
new BufferedReader (new InputStreamReader(System.in));
static void echoLines (int numberOfInputLines) {
try {
for (int inputNum = 0;inputNum <
numberOfInputLines;inputNum++)
System.out.println(input.readLine());
} catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
Procedure does not return any value
Can convert it into a function that returns an error code
![Page 20: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/20.jpg)
20
CONVERTING PROCEDURE TO FUNCTION:
RETURNING ERROR CODES static BufferedReader input =
new BufferedReader (new InputStreamReader(System.in));
static int echoLines (int numberOfInputLines) {
try {
for (int inputNum = 0;inputNum <
numberOfInputLines;inputNum++)
System.out.println(input.readLine());
return 0;
} catch (IOException e) {
return -1;
}
Fake function with side effects
![Page 21: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/21.jpg)
21
PASSING THE BACK: ERROR CODE SOLUTION
Pass back error codes to caller
Procedure
“Works” as we can make it return value instead of void
Programmer cannot distinguish between true and fake
procedure
Function
Either unsigned integer (int, short, long) converted into much
larger signed integers
Or error code may be legal return value if integer function
returns all possible values
![Page 22: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/22.jpg)
22
GLOBAL VARIABLE SOLUTION?
Store error codes in common variables
Does not work when there are multiple calls to the same
method
A call may overwrite value written by another call
Variable may accessed by other methods sharing its
scope
Least privilege violated
![Page 23: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/23.jpg)
23
HOW TO PROPAGATE EXCEPTION?
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); return 0; } }
Do not handle it.
![Page 24: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/24.jpg)
24
EXCEPTION PROPAGATION
Java lets exceptions be “returned” instead of regular
values.
No need to overload function return value or make
procedure return value
These propagate through call chain until some
method responds to them by catching them
Caller should somehow know that it should catch
exception
![Page 25: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/25.jpg)
25
static void echoLines(int numberOfInputLines) { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
PROPAGATING ECHOLINES
How to tell caller that it should catch exception?
![Page 26: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/26.jpg)
26
static void echoLines(int numberOfInputLines) throws IOException { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
PROPAGATING ECHOLINES
Tells caller that passing it or throwing the exception, a
special return value
![Page 27: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/27.jpg)
27
static int numberOfInputLines(String[] args) throws ArrayIndexOutOfBoundsException { return Integer.parseInt(args[0]); }
PROPAGATING NUMBEROFINPUTLINES
Tells caller that passing it or throwing the exception
![Page 28: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/28.jpg)
28
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); echoLines(1); } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } }
HANDLING IN CALLER
Has context
IO exception not caught
![Page 29: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/29.jpg)
29
static void echoLines(int numberOfInputLines) throws IOException { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
PROPAGATING ECHOLINES (REVIEW)
Tells caller that passing it or throwing the exception, a
special return value
![Page 30: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/30.jpg)
30
static int numberOfInputLines(String[] args) throws ArrayIndexOutOfBoundsException { return Integer.parseInt(args[0]); }
PROPAGATING NUMBEROFINPUTLINES (REVIEW)
Tells caller that passing it or throwing the exception
![Page 31: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/31.jpg)
31
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); echoLines(1); } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } }
HANDLING IN CALLER (REVIEW)
Has context
IO exception not caught
![Page 32: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/32.jpg)
32
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); try { echoLines(1); } catch (IOException ioe) { System.out.println("Did not input the one input string, which is the default in case of missing argument, before input was closed. "); } } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } }
NESTED EXCEPTIONS
Parameters in nested trys must have
different names
Parameters in sibling trys can
have same name
![Page 33: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/33.jpg)
33
public static void main(String args[]) throws IOException, ArrayIndexOutOfBoundsException { echoLines(numberOfInputLines(args)); }
IMPLICIT THROWING, MULTIPLE THROWN
EXCEPTIONS
Bad idea as interpreter’s messages may be meaningless to the user
Multiple exceptions can be “thrown”
Not catching and hence indirectly throwing an exception that was thrown to it
Both thrown exceptions acknowledged
![Page 34: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/34.jpg)
34
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); return 0; } }
static int numberOfInputLines(String[] args) throws ArrayIndexOutOfBoundsException { return Integer.parseInt(args[0]); }
ARRAYINDEXBOUNDS ALTERNATIVES
Purely a documentation feature, exception propagated regardless of
whether it exists
static int numberOfInputLines(String[] args){ return Integer.parseInt(args[0]); }
Java knows method is not catching a potential exception but does not
complain about lack of documentation
Caller does not know what it must handle
It may not have code to handle
Throws clause is a form of documentation like
comments, annotations, interfaces, and assertions.
![Page 35: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/35.jpg)
35
public static void main(String args[]) throws ArrayIndexOutOfBoundsException { echoLines(numberOfInputLines(args)); }
static void echoLines(int numberOfInputLines) { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
OMITTING IOEXCEPTION IN THROWS CLAUSE
Java complains IOException neither handled nor acknowledged
IOException not acknowledged
![Page 36: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/36.jpg)
36
JAVA HAS TWO KINDS OF EXCEPTIONS
Unchecked exceptions
Uncaught exceptions need not be acknowledged in method headers (if they can be thrown)
Checked exceptions
Uncaught exceptions must be acknowledged in header of class and interface method (if they can be thrown)
Tells caller that passing it or throwing the exception, a special return value
Rationale for division?
public void echoLines(int numberOfInputLines) throws IOException { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
public void echoLines(int numberOfInputLines)throws IOException
![Page 37: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/37.jpg)
37
LACK OF UNIFORMITY
static void echoLines(int numberOfInputLines) { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
static int numberOfInputLines(String[] args){ return Integer.parseInt(args[0]); }
IOException must be acknowledged
ArrayIndexOutOfBounds need not be
acknowledged
![Page 38: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/38.jpg)
38
static void safeArrayIndexer() throws ArrayIndexOutOfBoundsException { String args[] = {"hello", "goodbye"}; System.out.println(args[1]); }
MISLEADING HEADER
Array indexing does not imply exception
It implies it may happen
Halting problem prevents Java from knowing if an exception will really be thrown In this case it can but does not
Its exception checking assumes the worst case – if an exception could be thrown (not if it is actually thrown)
In the case of checked exceptions, if there is an operation that may throw it cries wolf
Making all exceptions checked would make coding of such methods painful and mislead the reader
Principles for determining which exceptions should be checked?
Array index out of bounds guaranteed to not happen
![Page 39: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/39.jpg)
39
CHECKED /UNCHECKED VS. KINDS OF ERRORS
User and other external error
Internal error
Which are preventable?
![Page 40: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/40.jpg)
40
ERRORS VS. PREVENTION
User and other external error
Programmer cannot prevent it
Should be acked as form of documentation
Internal error
Programmer can prevent
A method that can be erroneous probably is not really
erroneous
Acking is probably misleading and needlessly increases
programming overhead
![Page 41: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/41.jpg)
41
JUSTIFICATION OF JAVA RULES
Java rules justified if:
Checked (Non-runtime) exceptions = user and other
external errors
Unchecked (runtime) exceptions = internal errors
![Page 42: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/42.jpg)
42
PROBLEMS WITH JAVA RULES
Unchecked exceptions can be caused by user error static int numberOfInputLines(String[] args) { return Integer.parseInt(args[0]); }
User error causes unchecked exception
![Page 43: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/43.jpg)
43
APPROACH 1: VOLUNTARILY LIST EXCEPTION
No way to force every caller that does not handle it to ack it.
static int numberOfInputLines(String[] args) throws ArrayIndexOutOfBoundsException { return Integer.parseInt(args[0]); }
public static void main(String args[]) throws IOException { echoLines(numberOfInputLines(args)); }
![Page 44: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/44.jpg)
44
APPROACH 2: CONVERT TO EXISTING CHECKED
EXCEPTION
static int numberOfInputLines(String[] args) throws IOException { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { throw new IOException ("First argument missing"); } }
Exception object thrown explicitly message
public static void main(String args[]) throws IOException { echoLines(numberOfInputLines(args)); } Forces every caller that does not handle it to ack it.
Exception message distinguishes it from read exception
Must query exception and do string equals() to type it
![Page 45: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/45.jpg)
45
static int numberOfInputLines(String[] args) throws AMissingArgumentException { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { throw new AMissingArgumentException("First argument missing"); }
APPROACH 3: CONVERT TO NEW CHECKED
EXCEPTION
Our own exception
Type of exception rather than message explains the exception
![Page 46: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/46.jpg)
46
PROGRAMMER-DEFINED EXCEPTION CLASS
public class AMissingArgumentException extends IOException{ public AMissingArgumentException(String message) { super(message); } }
No interface, as Java does not have one for Exceptions
Not adding any methods
A missing argument error is an input/output error
Checked?
![Page 47: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/47.jpg)
47
CHECKED VS. UNCHECKED PROGRAMMER-
DEFINED EXCEPTIONS
An exception class must be subclass of existing exception classes
(Direct or indirect) subclasses of RuntimeException are unchecked
Also called “runtime”, but all exceptions are runtime!
(Direct or indirect) subclasses of RuntimeException
E.g. ArrayIndexOutofBoundsException
All other exception classes are checked
![Page 48: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/48.jpg)
48
PART OF EXCEPTION HIERARCHY
Exception
RuntimeException
IndexOutOf BoundsException
IOException
AMissing Argument Exception
EOF Exception
Remote Exception
ClassCast Exception
ArrayIndexOutOf BoundsException
Unchecked Checked
![Page 49: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/49.jpg)
49
ERROR HANDLING ERROR RECOVERY AND
REPORTING
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (AMissingArgumentException e) { System.out.println("Did not enter an argument. Assuming a single input line."); try { echoLines(1); } catch (IOException ioe) { System.out.println("Did not input the one input string, which is the default in case of missing argument, before input was closed. "); } } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } }
Exception object not used
![Page 50: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/50.jpg)
50
ERROR HANDLING REPORTING ERROR
MESSAGE, USING CATCH PARAMETER
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (AMissingArgumentException e) { System.out.println(e); System.exit(-1); } catch (IOException e) { System.out.println(e); System.exit(-1); } }
e.getMessage()
![Page 51: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/51.jpg)
51
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (AMissingArgumentException e) { e.printStackTrace(); System.exit(-1); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } }
PRINTING STACK TRACE, USING CATCH
PARAMETER
Stack when exception is thrown, not when it is printed.
Remove code duplication?
main()
numberOfInputLines
main() main()
![Page 52: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/52.jpg)
52
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } }
REMOVING CODE DUPLICATION
AMissingArgumentException IS-A (IS-Subclass of) IOException
![Page 53: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/53.jpg)
53
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } catch (AMissingArgumentException e) { System.out.println(e); System.exit(-1); } }
SUPERCLASS BEFORE SUBCLASS
AMissingArgumentException processed here List exception subclass before
superclass
Unreachable block
![Page 54: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/54.jpg)
54
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (AMissingArgumentException e) { System.out.println(e); System.exit(-1); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } }
SUBCLASS BEFORE SUPERCLASS
![Page 55: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/55.jpg)
55
static int numberOfInputLines(String[] args) { return Integer.parseInt(args[0]); }
OTHER EXCEPTIONS?
Exception?
NumberFormatException
![Page 56: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/56.jpg)
56
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (IOException e) { e.printStackTrace(); System.exit(-1); } }
UNCAUGHT EXCEPTION?
NumberFormatException not caught
![Page 57: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/57.jpg)
57
MORE ROBUST HANDLING
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (Exception e) { e.printStackTrace(); System.exit(-1); } }
NumberFormatException caught
![Page 58: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/58.jpg)
58
EXCEPTIONS AND INITIALIZATION APPROACHES
int numberOfInputLines = 5;
int numberOfInputLines;
numberOfInputLines = 5;
Initializing Declaration
Un-initializing Declaration
Constructor initialization
Initialize while declaring
Declare and then initialize in constructor
(or some other method)
![Page 59: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/59.jpg)
59
public class InitializationAndCheckedExceptions { int numberOfInputLines; public InitializationAndCheckedExceptions() { try { numberOfInputLines = numberOfInputLines(new String[] {"45"}); } catch (AMissingArgumentException e) { e.printStackTrace(); } } }
public class InitializationAndCheckedExceptions { int numberOfInputLines = numberOfInputLines(new String[] {"45"}); … }
EXCEPTIONS AND INITIALIZATION APPROACHES
Checked exception not being handled or
acknowledged
Must call functions that can throw unchecked exceptions in constructors
rather than during initialization
![Page 60: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/60.jpg)
60
public static void main(String args[]) { try { echoLines(numberOfInputLines(args)); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); try { echoLines(1); } catch (IOException ioe) { System.out.println("Did not input the one input string, which is the default in case of missing argument, before input was closed. "); } } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } }
NESTED EXCEPTIONS EXAMPLE REVISITED
How to determine how long the method takes?
![Page 61: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/61.jpg)
61
public static void main(String args[]) { long startTime = System.currentTimeMillis(); try { echoLines(numberOfInputLines(args)); System.out.println(System.currentTimeMillis() - startTime); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); try { echoLines(1); System.out.println(System.currentTimeMillis() - startTime); } catch (IOException ioe) { System.out.println("Did not input the one input string, which is the default in case of missing argument, before input was closed. "); System.out.println(System.currentTimeMillis() - startTime); } } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); System.out.println(System.currentTimeMillis() - startTime); } }
SYSTEM.CURRENTTIMEMILLS()
Code duplication
![Page 62: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/62.jpg)
62
public static void main(String args[]) { long startTime = System.currentTimeMillis(); try { echoLines(numberOfInputLines(args)); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument. Assuming a single input line."); try { echoLines(1); } catch (IOException ioe) { System.out.println("Did not input the one input string, which is the default in case of missing argument, before input was closed. "); System.out.println(System.currentTimeMillis() - startTime); } } catch (IOException e) { System.out.println("Did not input the correct number of input strings before input was closed. "); } finally { System.out.println(System.currentTimeMillis() - startTime); } }
FINALLY
All paths that lead from try block end up in finally. Finally executed before the code
following the try block
Finally without catch?
![Page 63: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/63.jpg)
63
public static int factorial(int n) { System.out.println("Started factorial:"+ n); try { if (n <= 1) return 1; return n * factorial(n-1); } finally { System.out.println("Ended factorial:" + n); } }
TRY AND FINALLY WITHOUT EXCEPTIONS
All paths that lead from try block end up in finally. Finally executed before the code
following the try block
![Page 64: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/64.jpg)
64
try {
for (int i = 0; i < list.length; i++) {
System.out.println((String) list[i]);
}
} catch (ClassCastException e) {
System.out.println(e);
}
INTRA-METHOD PROPAGATION
for (int i = 0; i < list.length; i++) {
try {
System.out.println((String) list[i]);
} catch (ClassCastException e) {
System.out.println(e);
}
println terminated and exception propagated to enclosing loop, which is also terminated, and
catch executed
Println terminated, catch executed, and loop continues
static Object[] list = {5, "hello", "goodbye" };
![Page 65: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/65.jpg)
65
TERMINATING PROGRAM VS. CONTINUING
Independent errors can be collected
Scanning: int 5a = 50
Dependent errors cannot be:
Parsing: 5 + 2 4 / - 2
![Page 66: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/66.jpg)
66
TRY CATCH SEMANTICS
A try catch block has One try block
One or more parameterized catch blocks
Zero or one finally block
When an exception occurs in a try block Remaining code in the try block is abandoned
The first catch block that can handle the exception is executed
The try catch block terminates when The try block executes successfully without exception
A catch block finishes execution Which may throw its own exceptions that may be caught or not
through try blocks
The finally block is called after termination of the try catch block and before the statement following the try catch block All paths from the associated try catch block lead to it
![Page 67: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/67.jpg)
67
try { for (;;) { String nextLine = input.readLine(); if (".".equals(nextLine)) break; System.out.println(Integer.parseInt(nextLine)); } } catch (Exception e) { e.printStackTrace(); }
CATCHING EXPECTED EVENTS
Better style
Less efficient, extra check
Better style trumps over efficiency
try { for (;;) { System.out.println(Integer.parseInt(input.readLine())); } } catch (Exception e) { }
Differentiating between expected
and unexpected events
![Page 68: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/68.jpg)
68
CHECKED EXCEPTION REVIEW
Checked exceptions
Uncaught exceptions must be acknowledged
![Page 69: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/69.jpg)
69
CATCHING VS. ACKNOWLEDGING
static void echoLines (int numberOfInputLines) {
try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
static void echoLines (int numberOfInputLines) throws IOException { for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
} static void echoLines (int numberOfInputLines) { for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}
static void echoLines (int numberOfInputLines) throws IOException{ try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
Allowed as caller will still work, though it will have extra handling
In real-life, analogous rules exist
![Page 70: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/70.jpg)
70
REAL LIFE ANALOGY
Should overstate rather than understate bad side effect Dizziness, headache
If you are bad, you should not say you are good.
People will be disappointed
If you are good, you can say you are bad
You don’t let people down
Makes sense if there is some uncertainty
![Page 71: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/71.jpg)
71
WHY ALLOW FALSE POSITIVES
static void echoLines (int numberOfInputLines) throws IOException { try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
Uncertainty in this case? No path can lead to an IO exception
In general, Java cannot tell if an exception throwing path is taken
Also method body may evolve (from stub to full implementation)
![Page 72: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/72.jpg)
72
INTERFACE ACKS BUT NOT CLASS
public void echoLines(int numberOfInputLines)throws IOException
public void echoLines (int numberOfInputLines) {
try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
In instance methods, must also consider variation of a method header
![Page 73: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/73.jpg)
73
INSTANCE METHOD VARIATIONS
Method header
Method implementation2
Method implementation1
![Page 74: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/74.jpg)
74
INTERFACE INSTANCE METHOD VARIATIONS
Method header
Method implementation2
Method implementation1 Class1 Class2
Interface
Throws exception1
Acknowledge exception union (exception1 and
exception2)
Throws exception2
![Page 75: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/75.jpg)
75
REAL LIFE ANALOGY
A car used by experienced drivers could have this sign
without doing harm.
![Page 76: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/76.jpg)
76
CAR DRIVEN BY EXPERIENCED AND NEW DRIVER
Car
Experienced Driver Student Driver
New Driver Warning
New Driver Warning
![Page 77: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/77.jpg)
77
MEDICINE USED BY REACTIVE AND NON
REACTIVE PERSON
Medicine
Person2 Person1
Gets Dizzy
Gets Dizzy
![Page 78: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/78.jpg)
78
INSTANCE METHOD VARIATIONS THROWING
DIFFERENT EXCEPTIONS
Method Header
Method implementation2
Method implementation1
Throws exception1
Acknowledge exception union (exception1 and
exception2)
Throws exception2
![Page 79: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/79.jpg)
79
EXCEPTIONS
Support typed errors
Provide a way to customize error handling
By default Java will terminate program
Allows more efficient error processing
Allows separation of error-handling and normal-
processing code
Allows error handling and error detection to be in
separate classes and methods
Without passing legal non erroneous values (null/-1)
Allows separate classes to provide error UI
![Page 80: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/80.jpg)
80
EXCEPTIONS
Errors may be internal or external
Exceptions allow custom error handling to be done
while following software engineering principles
Try and catch blocks allow programmers to easily
separate error handling and non error handling code
Sometimes error handing should be distributed
among error detecting method and its callers
Need a way for error information to be passed to
caller, that is, propagate error information’
Checked and unchecked exceptions
![Page 81: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/81.jpg)
81
CHECKED VS. UNCHECKED
Unchecked
No rules
Checked
uncaught in method body => acknowledged in
method header
unacknowledged in method header => caught in
method body (from 1)
unacknowledged in interface/supertype method-
header => unacknowledged in class/subtype
method-header
unacknowledged in interface/supertype method-
header => caught in method body (from 2 and 3)
interface can be used to force method
implementations to catch exceptions
Method
Header in
Interface/
Supertype
Method
Header in
Class/
Subtupe
Method Body
in Class/
Subtype
Prevent
acknowledgment
Force catching
![Page 82: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/82.jpg)
82
IS-A RULE FOR EXCEPTIONS
Exception of type T1 uncaught in method body
exception of type T2, where T1 IS-A T2,
acknowledged in method header
Exception of type T1 acknowledged in
interface/supertype method-header exception of
type T2, where T2 IS-A T1, acknowledged in
class/subclass method-header
![Page 83: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/83.jpg)
83
IS-A RULE FOR EXCEPTIONS
Overzealous handling not allowed
Can add fine-grained or coarse-grained trys
Should have exception and not normal handling in
catches
![Page 84: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/84.jpg)
84
EXTRA SLIDES
![Page 85: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/85.jpg)
85
STATIC METHOD EXAMPLE
static void echoLines (int numberOfInputLines) throws IOException { try {
for (int inputNum = 0;inputNum < numberOfInputLines;inputNum++)
System.out.println(input.readLine());
}catch (IOException e) {
System.out.println("Did not input " + numberOfInputLines +
" input strings before input was closed. ");
System.exit(-1);
}
}
Need instance method example for variations
![Page 86: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/86.jpg)
86
INTERFACE AND ITERATOR
public interface StringIterator { public String next(); public boolean hasNext(); }
public class IteratedStringPrinter { public static void print(StringIterator aStringIterator) { while (aStringIterator.hasNext()) System.out.println(aStringIterator.next()); } }
![Page 87: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/87.jpg)
87
public class AnArrayIterator implements StringIterator { String[] elements; int nextIndex; public AnArrayIterator(String[] anElementArray) { elements = anElementArray; } public String next() { String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; } }
AN ARRAY ITERATOR IMPLEMENTATION
public interface StringIterator { public String next(); public boolean hasNext(); }
![Page 88: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/88.jpg)
88
WITH UNCHECKED EXCEPTION public class AnArrayIteratorThrowingUncheckedException implements StringIterator { String[] elements; int nextIndex; public AnArrayIteratorThrowingUncheckedException(String[] anElementArray) { elements = anElementArray; } public String next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; }
Unchecked, as most users expected to call hasNext() before next()
Good idea to throw this exception when no more
elements so caller knows what went wrong
![Page 89: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/89.jpg)
89
UNMATCHED HEADERS public class AnArrayIteratorThrowingUncheckedException implements StringIterator { String[] elements; int nextIndex; public AnArrayIteratorThrowingUncheckedException(String[] anElementArray) { elements = anElementArray; } public String next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; }
public interface StringIterator { public String next(); public boolean hasNext(); }
Interface and class headers do not match
OK as exception is unchecked
![Page 90: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/90.jpg)
90
UNMATCHED BODY AND HEADERS public class AnArrayIteratorThrowingUncheckedException implements StringIterator { String[] elements; int nextIndex; public AnArrayIteratorThrowingUncheckedException(String[] anElementArray) { elements = anElementArray; } public String next() { if (!hasNext()) throw new NoSuchElementException(); String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; }
public interface StringIterator { public String next(); public boolean hasNext(); }
Body and class headers do not match
OK as exception is unchecked
![Page 91: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/91.jpg)
91
public class AnInputStreamScannerThrowingIOException
implements … {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = input.readLine();
return retVal;
}
}
CHECKED EXCEPTION: INPUT READING ITERATOR
(A LA SCANNER):
When no more elements When EOF or other IOException occur
![Page 92: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/92.jpg)
92
public class AnInputStreamScannerThrowingIOException
implements StringIterator {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = input.readLine();
return retVal;
}
}
SCANNER-BASED ITERATOR
public interface StringIterator {
public String next();
public boolean hasNext();
Caller of interface method not ready to handle checked exception
Interface header must report union of all (checked) exceptions thrown by implementation
![Page 93: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/93.jpg)
93
public class AnInputStreamScanner implements StringIterator {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
try {
nextLine = input.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return retVal;
}
}
FORCING CLASS TO CATCH
Unacknowledged in interface method-header caught in class method body
![Page 94: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/94.jpg)
94
CHANGING THE INTERFACE AND INTERFACE USER
public interface StringIteratorThrowingIOException { public String next () throws IOException ; public boolean hasNext(); }
public static void print(StringIteratorThrowingIOException aStringIterator) { try { while (aStringIterator.hasNext()) System.out.println(aStringIterator.next()); } catch (IOException e) { e.printStackTrace(); } }
![Page 95: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/95.jpg)
95
public class AnInputStreamScannerThrowingIOException
implements StringIteratorThrowingIOException {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = input.readLine();
return retVal;
}
}
THROWING EXCEPTION IN ONE IMPLEMENTATION
![Page 96: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/96.jpg)
96
public class AnotherArrayIteratorThrowingUncheckedException implements StringIteratorThrowingIOException { String[] elements; int nextIndex; public AnotherArrayIteratorThrowingUncheckedException(String[] anElementArray) { elements = anElementArray; } public String next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; } }
NOT THROWING EXCEPTION IN ANOTHER
IMPLEMENTATION
Interface user will still work
Interface declares union of all exceptions thrown by implementations
public interface StringIteratorThrowingIOException { public String next () throws IOException; public boolean hasNext(); }
![Page 97: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/97.jpg)
97
public class AnotherArrayIteratorThrowingUncheckedException implements StringIteratorThrowingIOException { String[] elements; int nextIndex; public AnotherArrayIteratorThrowingUncheckedException(String[] anElementArray) { elements = anElementArray; } public String next() throws NoSuchElementException { if (!hasNext()) throw new NoSuchElementException(); String retVal = elements[nextIndex]; nextIndex++; return retVal; } public boolean hasNext() { return nextIndex < elements.length; } }
EVEN MORE OVERSTATEMENT
Interface user will still work
Interface declares union of all exceptions thrown by implementations
public interface StringIteratorThrowingIOException { public String next () throws Exception; public boolean hasNext(); }
![Page 98: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/98.jpg)
98
INSTANCE METHOD VARIATIONS THROWING
DIFFERENT EXCEPTIONS
Method Header
Method implementation2
Method implementation1
Throws exception1
Acknowledge exception union (exception1 and
exception2)
Throws exception2
![Page 99: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/99.jpg)
99
CATCHING THROWN EXCEPTION
public interface StringIteratorThrowingIOException { public String next () throws IOException ; public boolean hasNext(); }
public static void print(StringIteratorThrowingIOException aStringIterator) { try { while (aStringIterator.hasNext()) System.out.println(aStringIterator.next()); } catch (IOException e) { e.printStackTrace(); } }
![Page 100: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/100.jpg)
10
0
OVERZEALOSUNESS: CATCHING MORE THAN
THROWN EXCEPTION
public interface StringIteratorThrowingIOException { public String next () throws IOException ; public boolean hasNext(); }
public static void print(StringIteratorThrowingIOException aStringIterator) { try { while (aStringIterator.hasNext()) System.out.println(aStringIterator.next()); } catch (IOException e) { e.printStackTrace(); } catch (ParseException re) { System.out.println(e); } }
Java complains that checked exception not
thrown by any path
Overstatement allowed by thrower but not
overzealousness by catcher
![Page 101: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/101.jpg)
10
1
CATCHING MORE THAN THROWN EXCEPTION
public interface StringIteratorThrowingIOException { public String next () throws IOException ; public boolean hasNext(); }
public static void print(StringIteratorThrowingIOException aStringIterator) { try { while (aStringIterator.hasNext()) System.out.println(aStringIterator.next()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { System.out.println(e); } }
Super type of thrown exception
Exception catch can handle checked exceptions
not covered by IOException catch
![Page 102: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/102.jpg)
10
2
ERROR RECOVERING NUMBEROFINPUTLINES
FUNCTION
static int numberOfInputLines(String[] args) { try { return Integer.parseInt(args[0]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Did not enter an argument."); return 0; } }
UI mixed in computation method
Error recovery: Program not halted May want to print on pop-up box
or in different language
Caller should decide what to do
May want to assume 1 instead of 0
![Page 103: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/103.jpg)
10
3
SPECIFIC BENEFITS
Support typed errors
Provide a way to customize error handling
By default Java will terminate program
Allows more efficient error processing
Allows separation of error-handling and normal-
processing code
Allows error handling and error detection to be in
separate classes and methods
Without passing legal non erroneous values (null/-1)
Allows separate classes to provide error UI
![Page 104: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/104.jpg)
10
4
REAL LIFE ANALOGY FOR OPTIONAL UNCHECKED
EXCEPTIONS
Optional warnings on cars
![Page 105: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/105.jpg)
10
5
PRINTING DEBUGGING INFORMATION
catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e);
}
catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
e.getMessage()
Stack when exception is thrown, not when it is printed.
![Page 106: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/106.jpg)
10
6
public class AllUpperCaseLettersInOrder implements CharIterator { char nextLetter = 'A'; public boolean hasNext() { return nextLetter <= 'Z'; } public char next() { char retVal = nextLetter; nextLetter = (char) (nextLetter + 1); return retVal; } }
AN ITERATOR IMPLEMENTATION
Exceptions?
public interface CharIterator { public char next(); public boolean hasNext(); }
Matching header for each interface method
![Page 107: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/107.jpg)
10
7
WITH EXCEPTION public class AllUpperCaseLettersInOrderThrowingException
implements CharIterator {
char nextLetter = 'A';
public boolean hasNext() {
return nextLetter <= 'Z';
}
public char next() throws NoSuchElementException {
if (!hasNext())
throw new NoSuchElementException();
char retVal = nextLetter;
nextLetter = (char) (nextLetter + 1);
return retVal;
}
}
Unchecked, as most users expected to call hasNext() before next()
Good idea to throw this exception when no more
elements so caller knows what went wrong
Checked or unchecked?
![Page 108: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/108.jpg)
10
8
UNMATCHED HEADERS
public interface CharIterator {
public char next();
public boolean hasNext();
}
Interface and class headers do not match
OK as exception is unchecked
public class AllUpperCaseLettersInOrderThrowingException
implements CharIterator {
char nextLetter = 'A';
public boolean hasNext() {
return nextLetter <= 'Z';
}
public char next() throws NoSuchElementException {
if (!hasNext())
throw new NoSuchElementException();
char retVal = nextLetter;
nextLetter = (char) (nextLetter + 1);
return retVal;
}
}
![Page 109: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/109.jpg)
10
9
public class AnInputStreamScannerThrowingIOException
implements … {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = input.readLine();
return retVal;
}
}
SCANNER-BASED ITERATOR
When no more elements
When next element erroneous
because of user error (e.g.
scanning rules violated)
![Page 110: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/110.jpg)
11
0
public class AnInputStreamScannerThrowingIOException
implements StringIterator {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = inputStream.readLine();
return retVal;
}
}
SCANNER-BASED ITERATOR
public interface StringIterator {
public String next();
public boolean hasNext();
}
Unacknowledged in interface method-header caught in method body
Caller of interface method not ready to handle exception
![Page 111: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/111.jpg)
11
1
public class AnInputStreamScanner
implements StringIterator {
BufferedReader inputStream =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = inputStream.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
try {
nextLine = inputStream.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return retVal;
}}
FORCING CLASS TO CATCH
public interface StringIterator {
public String next();
public boolean hasNext();
}
![Page 112: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/112.jpg)
11
2
public class AnInputStreamScanner
implements StringIteratorThrowingIOException {
BufferedReader inputStream =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = inputStream.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
try {
nextLine = inputStream.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return retVal;
}}
OVERSTATING IN INTERFACE
public interface StringIterator {
public String next() throws IOException;
public boolean hasNext();
} Interface user will still work
Some other class may not catch exception
Interface declares union of all exceptions thrown
by implementations
![Page 113: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/113.jpg)
11
3
public class AnInputStreamScannerThrowingIOException
implements StringIterator {
BufferedReader inputStream =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = inputStream.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine;
nextLine = inputStream.readLine();
return retVal;
}
}
OVERSTATING THROUGH SUPER TYPE
public interface StringIteratorThrowingException {
public String next() throws Exception;
public boolean hasNext();
}
Interface declares union of all exceptions thrown
by implementations
Supertype (stronger advertisement) allowed in
interface method
![Page 114: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/114.jpg)
11
4
public class AnInputStreamScannerThrowingIOException
implements StringIterator {
BufferedReader input =
new BufferedReader(new InputStreamReader(System.in));
public static final String QUIT_COMMAND = "quit";
String nextLine;
public AnInputStreamScannerThrowingIOException()
throws IOException {
nextLine = input.readLine();
}
public boolean hasNext() {
return nextLine.equals(QUIT_COMMAND);
}
public String next() throws IOException,NoSuchElementException {
if (!hasNext()) throw new NoSuchElementException();
String retVal = nextLine; try { nextLine = inputStream.readLine(); } catch (IOException e) { e.printStackTrace(); } return retVal;
}
}
FORCING CLASS TO CATCH
Unacknowledged in interface method-header caught in class method body
![Page 115: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/115.jpg)
11
5
CHECKED VS. UNCHECKED
Unchecked
No rules
Checked
uncaught in method body => acknowledged in method
header
unacknowledged in method header => caught in method
body (from 1)
unacknowledged in interface/supertype method-header
=> unacknowledged in class/subtype method-header
unacknowledged in interface/supertype method-header
=> caught in method body (from 2 and 3)
interface can be used to force method implementations to
catch exceptions
Method
Header in
Interface/
Supertype
Method
Header in
Class/
Subtupe
Method
Body in
Class/
Subtype
Prevent
acknowledgment
Force catching
![Page 116: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/116.jpg)
11
6
CLASS INSTANCE METHOD VARIATIONS
Method header
Method implementation2
Method implementation1 Subclass1 Subclass2
Superclass Acknowledge exception union (exception1 and
exception2)
Throws exception1
Throws exception2
![Page 117: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/117.jpg)
11
7
INSTANCE METHOD VARIATIONS THROWING
DIFFERENT EXCEPTIONS
Method Header
Method implementation2
Method implementation1
Throws exception1
Acknowledge exception union (exception1 and
exception2)
Throws exception2
![Page 118: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/118.jpg)
11
8
public static void main(String args[]) throws ArrayIndexOutOfBoundsException { echoLines(numberOfInputLines(args)); }
static void echoLines(int numberOfInputLines) { for (int inputNum = 0; inputNum < numberOfInputLines; inputNum++) System.out.println(input.readLine()); } }
OMITTING IOEXCEPTION IN THROWS CLAUSE
Java complains IOException neither handled nor acknowledged
Caller does not know what it must handle
Throws clause is a form of documentation like
comments, annotations, interfaces, and assertions. It may not have code to
handle
IOException not acknowledged
![Page 119: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/119.jpg)
11
9
WHY NOT
No complaints from Java for omitting throws clause
static int numberOfInputLines(String[] args) { return Integer.parseInt(args[0]); }
public static void main(String args[]) throws IOException { echoLines(numberOfInputLines(args)); }
ArrayIndexOutOf BoundsException
not acknowledged
![Page 120: COMP 401 EXCEPTIONS - Computer Sciencedewan/comp401/current/Lectures/... · 2013. 11. 22. · Java knows method is not catching a potential exception but does not complain about lack](https://reader033.vdocument.in/reader033/viewer/2022053118/609eda201ff7c52fd65931fe/html5/thumbnails/120.jpg)
12
0
static int numberOfInputLines(String[] args) throws IOException { return Integer.parseInt(args[0]); }
EVEN MORE SEVERE FALSE POSITIVE