190 likes | 202 Views
Learn about exceptions in Java programming including types of exceptions, handling exceptions, creating custom exceptions, and propagating exceptions.
E N D
E x c e p t i o n s Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. — Martin Golding
Outline for Today • What is an Exception? • checked v. unchecked • How to Catch Exceptions • examples of good and bad try-catch code • Creating your own types of Exception • declaring your new exception • throwing your new exception
Definition An exception is an event that occurs during the execution of a program that disrupts the normal flow of instructions during the execution of a program.
Sample Exceptions • ArithmeticException • when a divide by zero is attempted • ArrayStoreException • trying to put an int into a float array • IndexOutOfBoundsException • accessing invalid array or string element • ArrayIndexOutOfBoundsException • subclass of IndexOutofBoundsException • accessing invalid array element • NegativeArraySizeException • obvious • NullPointerException • when you try to dereference a null object reference
Part of the Exception Class Hierarchy • Throwable • Error • Exception • ClassNotFoundException • InstantiationException • IOException • FileNotFoundException • EOFException • RuntimeException • ArithmeticException • ClassCastException • IllegalArgumentException • IllegalThreadStateException • NumberFormatException • NullPointerException
Types of Exceptions • Error • example - OutOfMemoryError • Exception • checked • example - FileNotFoundException • unchecked • example - ArrayIndexOutOfBoundsException • "checked" must be handled • "unchecked" are usually not dealt with directly • all "errors" are "unchecked"
How Exceptions are Propagated • When a statement produces an exception (checked or unchecked) and the statement is not inside a try statement, then the exception is thrown up to whoever called this piece of code. • If that calling function does not catch the exception, the exception is passed up to whoever called this function. • etc etc etc • If main throws an exception, then the JVM prints the calling stack and exits the program.
The throws Statement "Checked" exceptions must be dealt with. If a statement can produced a checked exception that statement must either be inside a try statement or the method must pass the possible exception up to the calling method via throws. public static void main(String[] args) throws IOException { code for reading or writing that is not inside a try statement }
Catching Exceptions try { code that might throw an exception } catch (ExceptionName param) { code used when this error occurs } catch (AnotherExceptionName param) { yadda yadda } finally { do this code, no matter if error occurs }
Example 1 - File Opening // open the data file for reading try { FileReader freader = new FileReader(fname); inputFile = new BufferedReader(freader); } catch (FileNotFoundException e) { System.out.println("Unknown File: " + fname); return; } catch (IOException e) { System.out.println("Error Opening " + fname); return; } Note: the order of these two exceptions is important
Example 2.1 - Converting String to Integer Version One - Crashes on Bad Input // read until eof and sum the values dataline = inputFile.readLine(); while (dataline != null) { nextint = Integer.parseInt(dataline); sum += nextint; dataline = inputFile.readLine(); }
Example 2.2 - Converting String to Integer Version Two - Sum is Wrong // read until eof and sum the values dataline = inputFile.readLine(); while (dataline != null) { try { nextint = Integer.parseInt(dataline); } catch (NumberFormatException nfe) { System.out.println("unable to ... } sum += nextint; dataline = inputFile.readLine(); }
Example 2.3 - Converting String to Integer Version Three - Infinite Loop // read until eof and sum the values dataline = inputFile.readLine(); while (dataline != null) { try { nextint = Integer.parseInt(dataline); sum += nextint; dataline = inputFile.readLine(); } catch (NumberFormatException nfe) { System.out.println("unable to ... } }
Example 2.4 - Converting String to Integer // read until eof and sum the values dataline = inputFile.readLine(); while (dataline != null) { try { nextint = Integer.parseInt(dataline); sum += nextint; } catch (NumberFormatException nfe) { System.out.println("unable to convert \"" + nfe.getMessage() + "\" into an integer"); } dataline = inputFile.readLine(); }
Creating Your Own Exceptions • Suppose you are writing a stack class. Then you will want to create your own exceptions. • StackException • StackOverflowException • StackUnderflowException • StackTypeMismatchException • Which existing exception class do you build your exception off of? • best idea is to use Exception • RuntimeException is okay
Example - new checked exception declaration of your stack class: public class StackClass { public class StackException extends Exception; {...} public class StackOverflowException extends StackException; {...} public int pop() {...} inside a method that uses your stack class: try { mystack.push(8); } catch (StackOverflowException e) see code on next slide
Example - declaration details public class StackException extends Exception { StackException () { super (); } StackException ( String description ) { super ( description ) } } "super" = use my mom's constructor
How to throw an exception public class StackClass { ... // the pop method public int pop () { if (stacksize == 0) throw StackUnderflowException; return list [ --stacksize ]; }
Next Classes • writing classes • writing classes that extend other classes