cpsc150 week 13 chapter 12 exceptions (from slides provided by textbook web site)

57
CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

Post on 21-Dec-2015

220 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Week 13

Chapter 12

Exceptions

(from slides provided by textbook web site)

Page 2: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Handling errors

2.1

Page 3: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Some causes of error situations

• Incorrect implementation.– Does not meet the specification.

• Inappropriate object request.– E.g., invalid index.

• Inconsistent or inappropriate object state.– E.g. arising through class extension.

Page 4: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Not always programmer error

• Errors often arise from the environment:– Incorrect URL entered.– Network interruption.

• File processing is particular error-prone:– Missing files.– Lack of appropriate permissions.

Page 5: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Exploring errors

• Explore error situations through the address-book projects.

• Two aspects:– Error reporting.– Error handling.

Page 6: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Issues to be addressed

• How much checking by a server on method calls?

• How to report errors?

What if no user at the other end (e.g., GUI)?

• How can a client anticipate failure?

• How should a client deal with failure?

Page 7: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

An example

• Create an AddressBook object.

• Try to remove an entry.

• A runtime error results.– Whose ‘fault’ is this?

• Anticipation and prevention are preferable to apportioning blame.

Page 8: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Argument values

• Arguments represent a major ‘vulnerability’ for a server object.– Constructor arguments initialize state.– Method arguments often contribute to

behavior.

• Argument checking is one defensive measure.

Page 9: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Checking the key

public void removeDetails(String key){ if(keyInUse(key)) { ContactDetails details = (ContactDetails) book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; }}

Page 10: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Server error reporting

• How to report illegal arguments?– To the user?

• Is there a human user?• Can they solve the problem?

– To the client object?• Return a diagnostic value

Page 11: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Returning a diagnostic(Exception handling without using

Java’s exception handling)public boolean removeDetails(String key){ if(keyInUse(key)) { ContactDetails details = (ContactDetails) book.get(key); book.remove(details.getName()); book.remove(details.getPhone()); numberOfEntries--; return true; } else { return false; }}

Page 12: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Client responses

• Test the return value.– Attempt recovery on error.– Avoid program failure.

• Ignore the return value.– Cannot be prevented.– Likely to lead to program failure.

• Create something client cannot ignore: – an exception

Page 13: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Exception-throwing principles

• Exceptions are part of many languages, central to Java.

• A special language feature.

• No ‘special’ return value needed.

• Errors cannot be ignored in the client.– The normal flow-of-control is interrupted.

• Specific recovery actions are encouraged.

Page 14: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Exceptions

• Exceptions are “thrown” by the method finding the problem

• Exceptions are “caught” by the method dealing with the problem

• maintains integrity and decoupling

Page 15: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The effect of an exception

• The throwing method finishes prematurely.

• No return value is returned.

• Control does not return to the client’s point of call.– So the client cannot carry on regardless.

• A client may ‘catch’ an exception.

Page 16: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Throwing an exception

/** * Look up a name or phone number and return the * corresponding contact details. * @param key The name or number to be looked up. * @return The details corresponding to the key, * or null if there are none matching. * @throws NullPointerException if the key is null. */public ContactDetails getDetails(String key){ if(key == null){ throw new NullPointerException( "null key in getDetails"); } return (ContactDetails) book.get(key); }

Page 17: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Throwing an exception

• An exception object is constructed:– new ExceptionType("...");

• The exception object is thrown:– throw ...

• Javadoc documentation:– @throws ExceptionType reason

Page 18: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Error recovery

• Clients should take note of error notifications.– Check return values.– Don’t ‘ignore’ exceptions.

• Include code to attempt recovery.– Will often require a loop.

Page 19: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The try statement

• Clients catching an exception must protect the call with a try statement:

try { Protect one or more statements here.}catch(Exception e) { Report and recover from the exception here.}

Page 20: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The try statement

try{ addressbook.saveToFile(filename); tryAgain = false;}catch(IOException e) { System.out.println("Unable to save to " + filename); tryAgain = true;}

1. Exception thrown from here

2. Control transfers to here

Page 21: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

try { // code that might throw an exception {catch (TypeOfException ex) { // what to do when there is a problem }// what to do afterwards regardless of // whether there was an exception

Page 22: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

try { // code that might throw an exception }catch (TypeOfException ex) { // what to do when there is a problem }// what to do afterwards regardless of // whether there was an exception

Order of statement execution

1. if method call, do method

2a. continue with rest of try

3a. skip catch, do code after try-catch

Case a: no exception thrown

Page 23: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

try { // code that might throw an exception {catch (TypeOfException ex) { // what to do when there is a problem }// what to do afterwards regardless of // whether there was an exception

Order of statement execution

1. if method call, do method

2b. skip rest of try; do code in catch

3b. if catch code does not abort program, continue after catch block

Case b: TypeOfException thrown

Page 24: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

try { // code that might throw an exception {catch (TypeOfException ex) { // what to do when there is a problem }// what to do afterwards regardless of // whether there was an exception

Order of statement execution

1. if method call, do method

2c. skip rest of try; do not do catch; return to method that called this method; exit from this method at the code in try; do not do any other code

3c. No other code in this method is executed. catch code and code afterwards is skipped

Case c: DifferentException thrown

Page 25: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

public class Myexcept{private int x;

public Myexcept() { x = 0; }

public int divideByY(int y) {

if (y == 0) { throw new ArithmeticException( "in divideByY, y, a denominator, is 0"); }

y= x /y; return y; }

An Exception Example

Page 26: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

At the Board

• Write a main method that calls divideByY

• Write a main method that has try-catch block

public class Myexceptpublic class Myexcept{{private int x;private int x;

public Myexcept()public Myexcept() { x = 0; }{ x = 0; }

public int divideByY(int y)public int divideByY(int y) {{

if (y == 0) {if (y == 0) { throw new ArithmeticException(throw new ArithmeticException( "in divideByY, y, a denominator, is 0"); }"in divideByY, y, a denominator, is 0"); } y= x /y;y= x /y; return y;return y; }}

Page 27: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

public static void main(String[] args)

{

Myexcept m = new Myexcept();

System.out.println("m with 4 is " + m.divideByY(4));

System.out.println("m with 0 is " + m.divideByY(0));

System.out.println("all done");

} // end main

} // end class

Page 28: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

public static void main(String args[ ]) {

try {System.out.println("m with 4 is " +

m.divideByY(4)); System.out.println("m with 0 is " +

m.divideByY(0)); } catch (ArithmeticException e) { System.out.println("don't call sample method with

0");e.printStackTrace();

} System.out.println("all done"); }

Page 29: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Attempting recovery// Try to save the address book.boolean successful = false;int attempts = 0;do { try { addressbook.saveToFile(filename); successful = true; } catch(IOException e) { System.out.println("Unable to save to " + filename); attempts++; if(attempts < MAX_ATTEMPTS) { filename = an alternative file name; } }} while(!successful && attempts < MAX_ATTEMPTS);if(!successful) { Report the problem and give up;}

Page 30: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

public class Test { public static void main(String args[]) { int n = 0; String s = null; boolean valid = false; while (!valid && n<3) try { s = JOptionPane.showInputDialog( null, "Enter an integer:" ); n = Integer.parseInt( s ); valid = true; } catch (Exception e) {

JOptionPane.showMessageDialog( null, "Enter a valid number" ); n++;

} // end of loop if (valid) JOptionPane.showMessageDialog( null, "The number is " + n ); }}

Page 31: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Catching multiple exceptionstry in order that they appear

try { ... ref.process(); ...}catch(EOFException e) { // Take action on an end-of-file exception. ...}catch(FileNotFoundException e) { // Take action on a file-not-found exception. ...}

Page 32: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The finally clause

try { Protect one or more statements here.}catch(Exception e) { Report and recover from the exception here.}finally { Perform any actions here common to whether or not an exception is thrown.}

Page 33: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The finally clause: why

• A finally clause is executed even if a return statement is executed in the try or catch clauses.

• A uncaught or propagated exception still exits via the finally clause.

Page 34: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The exception class hierarchy

Page 35: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Exception categories

• Checked exceptions– Subclass of Exception– Use for anticipated failures.– Where recovery may be possible.– Often not a programming problem (e.g., file not found)

• Unchecked exceptions– Subclass of RuntimeException– Use for unanticipated failures.– Where recovery is unlikely.– Often, a programming problem (e.g., index out of bounds)

• Third category: errors

Page 36: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Unchecked exceptions

• Use of these is ‘unchecked’ by the compiler.

• Cause program termination if not caught.– This is the normal practice.

• IllegalArgumentException is a typical example.

Page 37: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Argument checking

public ContactDetails getDetails(String key){ if(key == null) { throw new NullPointerException( "null key in getDetails"); } if(key.trim().length() == 0) { throw new IllegalArgumentException( "Empty key passed to getDetails"); } return (ContactDetails) book.get(key);}

Page 38: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Checked Exceptions

• Previous examples all unchecked exceptions– unchecked exceptions should not happen; mostly

result in program termination

• Checked exceptions are meant to be caught.• The compiler ensures that their use is tightly

controlled.– In both server and client.

• Used properly, failures may be recoverable.

Page 39: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Some Checked Exceptions

– ClassNotFoundException– IOException– NoSuchFieldException– ServerNotActiveException– UnsupportedFlavorException

Page 40: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

The throws clause

• Methods throwing a checked exception must include a throws clause:

public void saveToFile(String destinationFile) throws IOException

• (NOT throw) throw is when the exception is thrown

Page 41: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

throws

• must include throws in methods that throw checked exceptions

• how do I know?

• javadoc/syntax errors

Page 42: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

// file output. method called from constructorpublic void writeto(String fileout, int nbrlines) throws

IOException// must have “throws IOException” even though // no “throw statement” { File outfile = new File(fileout); FileWriter fw = new FileWriter(outfile); // usually a loop to write out all information // write to writer, not file fw.write("There were " + nbrlines + " lines in the input

file."); fw.close(); }

Page 43: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Files

Chapter 12 continued

Page 44: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Text input-output:tie to exceptions

• Input-output is particularly error-prone.– It involves interaction with the external

environment.

• The java.io package supports input-output.

• java.io.IOException is a checked exception.

• cannot do files without exceptions

Page 45: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Files

• To use files, use File class

• File class can’t read/write

• To read/write files, use Reader/Writer classes

• File input can be text-based (what we’ll do), stream-based

Page 46: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Readers, writers, streams

• Readers and writers deal with textual input.– Based around the char type.

• Streams deal with binary data.– Based around the byte type.

• The address-book-io project illustrates textual IO.

Page 47: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Text output

• Use the FileWriter class.– Tie File object to diskfile name– Open a FileWriter; tie to File.– Write to the FileWriter.– Close the FileWriter.

• Failure at any point results in an IOException.

Page 48: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Text output

try { FileWriter writer = new FileWriter("name of file"); while(there is more text to write) { ... writer.write(next piece of text); ... } writer.close();}catch(IOException e) { something went wrong with accessing the file}

Page 49: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Text input

• Use the FileReader class.• Augment with BufferedReader for line-

based input.– Open a file.– Read from the file.– Close the file.

• Failure at any point results in an IOException.

Page 50: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Text input

try { BufferedReader reader = new BufferedReader( new FileReader( new File("filename"))); String line = reader.readLine(); while(line != null) { do something with line line = reader.readLine(); } reader.close();}catch(FileNotFoundException e) { the specified file could not be found}catch(IOException e) { something went wrong with reading or closing}

Page 51: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

import java.io.*;

public class countlines{

// all methods that do something inserted here

public static void main(String[] args) { if (args.length != 2) { System.out.println("to run, type: 'countlines filein fileout'"); System.exit(1); }// create a new countline object with first arg as input file, second as

output countlines cl = new countlines(args[0], args[1]);

}}

Page 52: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Write a program to count number of lines in a file and write the number

to an output filejava countlines myinfile.txt myoutfile.txt

would return 2 if file is:

This is a file

with two lines.

myinfile.txt

Page 53: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

// constructorpublic countlines(String filein, String fileout) { try { int countwords = readfrom(filein); writeto(fileout, countwords); } catch (IOException e) { // will catch IO exception not caught by readfrom and writeto

System.out.println("Problems with IO. " + " Program aborted without successful

write."); } }

Page 54: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

public int readfrom(String filename) throws IOException { int countlines = 0; try { File infile = new File(filename); BufferedReader reader = new BufferedReader(new

FileReader(infile)); String line; line = reader.readLine(); while (line != null) { System.out.println(line); // for debugging only; countlines++; line = reader.readLine(); } reader.close(); } catch (FileNotFoundException e) { System.out.println("The input file was not there"); } return countlines; }

Page 55: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Other Wrappers

• Can break string read up using StringTokenizer

• Can read non-text files with FileReader and Tokenizer (breaks fields up to be read)

Page 56: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

Console input Scanner class: Java 5

import java.util.*; class MyScanner { public MyScanner ( ) {

Scanner scanner = new Scanner(System.in); System.out.println("Enter a number: "); int x = scanner.nextInt(); int y = scanner.nextInt();

System.out.println("The sum of " + x + " + " + y + " is " + (x+y)); }}

Page 57: CPSC150 Week 13 Chapter 12 Exceptions (from slides provided by textbook web site)

CPSC150

File input using Scannerimport java.util.*; import java.io.*;class MyScanner { public MyScanner ( ) {

Scanner scanner; try { scanner = new Scanner(new File("infile.java"));

int x = scanner.nextInt( ); int y = scanner.nextInt( );

System.out.println("The sum of " + x + " + " + y + " is " + (x+y)); }

catch (FileNotFoundException ex) { System.out.println("File not found ...aborting program."); System.exit(1); } }}