Lecture ?. Java Exception Handling
Download
Report
Transcript Lecture ?. Java Exception Handling
Java Programming
Java Exception Handling
Cheng-Chia Chen
Transparency No. 1-1
Basic Java Syntax
Contents
1.
2.
3.
4.
5.
6.
Traditional approach to program errors/exceptions
Java’s exception handling
The try statement
Exception propagation
The catch clause
The finally clause
Transparency No. 1-2
Basic Java Syntax
Unexpected conditions which may arise during program execution
called exceptions
Examples:
System file or i/o errors, disk full or unavailable, socket connection
closed.
Program file or i/o errors, unexpected EOF, file not found.
Programmer errors, array subscript out of bounds,
System errors, unable to load class file, problems with JVM.
Traditional approach to exceptions:
mechanism: return value indicating occurrence of exceptions + special
error_code variable storing exact type or details of errors
problems:
1. Exceptions are not forced to be handled and error checking may be
ignored entirely.
2. difficult to deal with when there are many types of exceptions that
need to be handled.
Transparency No. 1-3
Basic Java Syntax
Example:
// this call may raise exceptions
dbh = dbm_open(dbname, 0, GDBM_WRCREAT, … );
// check/handle all possible exceptions raised from previous call.
if (dbh == NULL) { // NULL indicates exceptions
logTime(); // error code stored in dbm_errno
const char *ret = dbm_strerror(dbm_errno);
fprintf(stderr, "ERROR Unable to open database: %s.\n", ret);
fflush(stderr);
return -1;
}
Transparency No. 1-4
Basic Java Syntax
Java’s Exceptions
An exception is an object that describes an unusual or
erroneous situation
Exceptions are thrown by a program, and may be caught and
handled by another part of the program
An error is also represented as an object in Java, but usually
represents a unrecoverable situation and should not be
caught
A program can therefore be separated into a normal
execution flow and an exception execution flow
Transparency No. 1-5
Basic Java Syntax
Exception Handling
A program can deal with an exception in one of three
ways:
ignore it
handle it where it occurs
handle it an another place in the program
The manner in which an exception is processed is an
important design consideration
3
Transparency No. 1-6
Basic Java Syntax
Exception Handling
If an exception is ignored by the program, the program
will terminate and produce an appropriate message
The message includes a call stack trace that indicates
on which line the exception occurred
The call stack trace also shows the sequence of method calls
that lead to the occurrence of the exception.
See Zero.java
4
Transparency No. 1-7
Basic Java Syntax
Java’s call stack on executing Zero
public class Zero {
static int divide(int x,int y)
{ return x/y;
// exception occurs here
}
public static void main(String[]
args) {
int x = 10;
int y = 0;
System.out.println
( divide(x,y)); // and here
} // method main
} // class Zero
java Zero
java.lang.ArithmeticExce
ption:
/ by zero
at
Zero.divide(Zero.java:3)
at
runtime
Zero.main(Zero.java:11)
call stack
Exception occurs here
divide(…)
main(…)
stack frame for main(…)
Transparency No. 1-8
Basic Java Syntax
Catch an exception where it occurs
java Zero
public class Zero {
0
static int divide(int x,int y)
{ try {
return x/y; // exception occurs here
} catch(Exception e) {
return 0 ; }
}
public static void main(String[] args) {
int x = 10;
int y = 0;
System.out.println ( divide(x,y));
} // method main
} // class Zero
Transparency No. 1-9
Basic Java Syntax
Catch exceptions by calling methods
java Zero
public class Zero {
1
static int divide(int x,int y)
{ try {
return x/y; // Exception occurs here
} catch(UnRelatedException e) {
return 0 ; }
// Exception not caught by this catch
}
public static void main(String[] args) {
int x = 10;
int y = 0;
try{
out.println ( divide(x,y)); // Exception is propagated here
}catch(Exception e) { // Exception get caught here!
out.println( 1 ); }
} // method main
} // class Zero
Transparency No. 1-10
Basic Java Syntax
The try Statement
Used to detect exceptions that may occurs within its body
(a try-block)
A try block is followed by one or more catch clauses,
which contain code to process an exception
Each catch clause has an associated exception type
When an exception occurs, processing continues at the
first catch clause that matches the exception type
See Product.java
5
Transparency No. 1-11
Basic Java Syntax
import java.io.*;
public class Product {
public static void main (String[] args) {
int x = UserReader.readInt(“Enter a number: ");
int y = UserReader.readInt("Enter another number: ");
System.out.println ("The product is: " + x*y );
} // method main
} // class Adding
class UserReader {
public static int readInt (String prompt) {
BufferedReader stdin = new BufferedReader
(new InputStreamReader(System.in));
int number = 0;
boolean valid = false;
Transparency No. 1-12
Basic Java Syntax
while (! valid) {
System.out.print (prompt); System.out.flush ();
try { // statements possibly throwing exceptions put here!!
number = Integer.parseInt (stdin.readLine());
valid = true;
} catch (NumberFormatException exception) {
System.out.println ("Invalid input. Try again.");
} catch (IOException exception) {
System.out.println ("Input problem. Terminating.");
System.exit(0);
}
}
return number;
} // method readInt
} // class UserReader
Transparency No. 1-13
Basic Java Syntax
Exception Propagation
If it is not appropriate to handle the exception where it
occurs, it can be handled at a higher level of some
calling method.
Exceptions propagate up through the method calling
hierarchy until they are caught and handled or until they
reach the outermost level
A try block that contains a call to a method in which an
exception is thrown can be used to catch that exception
See PropagationDemo.java
6
Transparency No. 1-14
Basic Java Syntax
public class Propagation {
static public void main (String[] args) {
ExceptionScope demo = new ExceptionScope();
System.out.println("program beginning");
demo.level1();
System.out.println("program ending");
} // method main
} // class Propagation
class ExceptionScope {
public void level3 (int a) {
int c = 1;
System.out.println("level3 beginning");
current = c / a; // divided by zero
System.out.println("level3 ending");
} // method level3
Transparency No. 1-15
Basic Java Syntax
public void level2() {
System.out.println("level2 beginning");
level3 (0);
System.out.println("level2 ending");
} // method level2
public void level1() {
System.out.println("level1 beginning");
try {
level2();
} catch (ArithmeticException p) {
System.out.println (p.getMessage());
p.printStackTrace();
}
System.out.println("level1 ending");
} // method level1
} // class ExceptionScope
Transparency No. 1-16
Basic Java Syntax
Exception propagation
main() :
…
demo.level1()
…
level2() :
level1() :
…
try{ …
level2() …}
catch(ArithmeticException p)
{…} ….
level3() :
…
…
level3()
…
c = c / 0; // divided by zero
…
normal flow
exception flow
Transparency No. 1-17
Basic Java Syntax
Types of Exceptions
An exception is either checked or unchecked
A checked exception can only be thrown
within a try block or
within a method that is declared (at the throws-clause of the
method header) to throw that exception
The compiler will complain if a checked exception is not
handled appropriately
An unchecked exception does not require explicit
handling, though it could be processed that way
In previous example, ArithmeticException is an unchecked
exception, hence it need not be declared even it is not
catched at method level3() and level2().
7
Transparency No. 1-18
Basic Java Syntax
The throw Statement
A programmer can define an exception by extending the
appropriate class
Exceptions are thrown using the throw statement:
throw exception-object;
See ThrowDemo.java
Usually a throw statement is nested inside an if
statement that evaluates the condition to see if the
exception should be thrown
8
Transparency No. 1-19
Basic Java Syntax
import java.io.IOException;
public class ThrowDemo {
public static void main (String[] args) throws MyExp {
MyExp p = new MyExp ("Alert!");
throw p;
// execution never gets to this point
} // method main
} // class ThrowDemo
class MyExp extends IOException {
MyExp (String message) {
super (message);
} // constructor Ooops
} // class Ooops
Transparency No. 1-20
Basic Java Syntax
The finally Clause
A try statement can have an optional clause designated
by the reserved word finally
If no exception is generated, the statements in the
finally clause are executed after the statements in the
try block complete
Also, if an exception is generated, the statements in the
finally clause are executed after the statements in the
appropriate catch clause complete
9
Transparency No. 1-21
Basic Java Syntax
The finally Clause
Exception Handling:
try {
code that may generate exceptions;
} catch (Exception1 e1) {
code to handle exception of type Exception1;
} catch( …. ){ …
} catch (ExceptionN eN) {
code to handle exception of type ExceptionN;
} finally {
code that are guaranteed to be executed before (normally or
abnormally) leaving this try-catch statement;
}
9
Transparency No. 1-22
Basic Java Syntax
Example finally-clause usage
public boolean deposit(int account, int amt ){
int old, balance;
old = balance =load(account);
try {
balance = balance + amt ; // suppose this operation may fail !
} catch (Exception e1) {
balance = old ; // recover balance
return false ;
} finally {
store( account, balance );
}
return true;
}
9
Transparency No. 1-23
Basic Java Syntax
(Part of) the Exception Hierarchy
Object Throwable
Eorror :
LinkageError, ThreadDeath, VirtualMachineError, AWTError
Exception:
RuntimeException
ArithmeticException
IndexOutOfBoundException
NullPointerException
…
IllegalAccessException
NoSuchMethodException
ClassNotFoundException
IOException
…
Note: Checked exception must be either catched or declared at the throwsclause of the method header.
All Throwable but Error and RuntimeException are checked Exceptions.
Transparency No. 1-24
Basic Java Syntax
What can we get from an Exception
java.lang.Throwable:
Constructor Summary
Throwable() : Constructs a new Throwable with null as its error message string.
Throwable([ [String msg] [, Throwable cause ]]) : Constructs a new Throwable with
the specified error message and/or cause.
Method Summary
Throwable fillInStackTrace() :
Fills in the execution stack trace.
String
getLocalizedMessage() : Creates a localized description of this Throwable.
String
getMessage() : Returns the error message string of this throwable object.
Throwable getCause();
void
printStackTrace(), printStackTrace(PrintStream s),
printStackTrace(PrinterWriter s) :
Prints this Throwable and its backtrace to the
standard error stream or s.
StackTraceElement[] getStackTrace() void setStackTraceElement(StackTrace[])
String toString() : Returns a short description of this throwable object.
java.lang.Exception:
Constructors: Exception(), Exception(String).
All methods are inherited from Throwable.
Transparency No. 1-25
Basic Java Syntax
StackTraceElement
An element in a stack trace, as returned by
Throwable.getStackTrace().
Each element represents a single stack frame.
All stack frames except for the one at the top of the stack represent a
method invocation.
The frame at the top of the stack represents the the execution point at
which the stack trace was generated.
Typically, this is the point at which the throwable corresponding to the
stack trace was created.
Methods
String getClassName()
String getMethodName()
boolean isNativeMethod()
String getFileName()
int getLineNumber()
Transparency No. 1-26