Chapter 11
1 / 77

Chapter 11 - PowerPoint PPT Presentation

  • Uploaded on

Chapter 11. Exceptions and Input/Output Operations. Topics. Exception Handling Using try and catch Blocks Catching Multiple Exceptions User-Defined Exceptions The Package Parsing a String using Scanner Reading Text Files Using Scanner

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
Download Presentation

PowerPoint Slideshow about ' Chapter 11' - phuc

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
Chapter 11

Chapter 11

Exceptions and Input/Output Operations


  • Exception Handling

    • Using try and catch Blocks

    • Catching Multiple Exceptions

    • User-Defined Exceptions

  • The Package

  • Parsing a String using Scanner

  • Reading Text Files Using Scanner

  • Writing and Appending to Text Files

  • Reading Structured Text Files

  • Reading and Writing Objects to a File


Illegal operations at run time can generate an exception.

For example, we have seen these exceptions:

  • ArithmeticException

  • NullPointerException

  • InputMismatchException

  • NumberFormatException

  • ArrayIndexOutOfBoundsException


  • 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

  • A program can be separated into a normal execution flow and an exception execution flow

  • An error is also represented as an object in Java, but usually represents a unrecoverable situation and should not be caught

Handling exceptions
Handling Exceptions

In a program without a Graphical User Interface, exceptions cause the program to terminate.

With this code that attempts to read an int:

String s = JOptionPane.showInputDialog( null,

"Enter an integer" );

int n = Integer.parseInt( s );

If the user enters a, we get a NumberFormatException:

See Example 11.1

Exception handling
Exception Handling

  • Java has a predefined set of exceptions and errors that can occur during execution

  • 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

Exception handling1
Exception Handling

  • If an exception is ignored by the program, the program will terminate abnormally and produce an appropriate message

  • The message includes a call stack trace that:

    • indicates the line on which the exception occurred

    • shows the method call trail that lead to the attempted execution of the offending line

Handling exceptions1
Handling Exceptions

We don't want invalid user input to terminate our programs! It is better to detect the problem and reprompt the user for the input.

Java allows us to intercept and handle some of these exceptions using try and catch blocks.

  • Inside the try block, we put the code that might generate an exception.

  • Inside catch blocks, we put the code to handle any exceptions that could be generated.

Minimum try catch syntax
Minimum try/catch Syntax



// code that might generate an exception


catch( ExceptionClass exceptionObjRef )


// code to recover from the exception


  • If an exception occurs in the try block, control jumps immediately to the catch block. No further instructions in the try block are executed.

  • If no exceptions are generated in the try block, the catch block is not executed.

Exception Class Hierarchy

The ExceptionClass parameter to the catch block can be any of these exceptions.

The Exception class, RuntimeException class,

and their subclasses are in the java.lang


The IOException class and its subclasses are in the package.

Checked and unchecked exceptions
Checked and Unchecked Exceptions

Java distinguishes between two types of exceptions:

Unchecked exceptionsare those that are subclasses of Error or RuntimeException

  • It is not mandatory to use try and catch blocks to handle these exceptions.

    Checked exceptions are any other exceptions.

  • Code that might generate a checked exception must be put inside a try block or the method must acknowledge that the exception may occur by using a throws clause in the method header. Otherwise, the compiler will generate an error.

Checked exceptions
Checked Exceptions

  • An exception is either checked or unchecked

  • A checked exception either must be caught by a method, or must be listed in the throws clause of any method that may throw or propagate it

  • A throws clause is appended to the method header

  • The compiler will issue an error if a checked exception is not caught or asserted in a throws clause

Unchecked exceptions
Unchecked Exceptions

  • An unchecked exception does not require explicit handling, though it could be processed that way

  • The only unchecked exceptions in Java are objects of type RuntimeException or any of its descendants

  • Errors are similar to RuntimeException and its descendants in that:

    • Errors should not be caught

    • Errors do not require a throws clause

Exception class methods
Exception Class Methods

Inside the catch block, you can call any of these methods of the Exception class:

Catching a numberformatexception
Catching a NumberFormatException

int n = 0; // declare and initialize variable

String s = JOptionPane.showInputDialog( null,

"Enter an integer" ); try


n = Integer.parseInt( s );

System.out.println( "You entered " + n );


catch ( NumberFormatException nfe )


System.out.println( "Incompatible data." );


See Example 11.2

Initializing variables for try catch
Initializing Variables for try/catch

Notice that we declare and initialize the input variable (n) before we enter the try block. If we do not initialize the variable and then try to accessit after the try/catch blocks, we will receive the following compiler error:

variable n might not have been initialized

The error indicates that the only place where n is assigned a value is in the try block. If an exception occurs, the try block will be interrupted and we might not ever assign n a value.

Initializing the value before entering the try block solves this problem.

Recovering from an exception
Recovering From an Exception

The previous code simply printed a message when the exception occurred.

To continue processing, reprompt the user for good input by putting the try and catch blocks inside a do/while loop, as shown on the next slide ->

See Example 11.3

int n = 0;

boolean goodInput = false; // flag variable

String s = JOptionPane.showInputDialog( null, "Enter an integer" );





n = Integer.parseInt( s );

goodInput = true; // executed if no exception


catch ( NumberFormatException nfe )


s = JOptionPane.showInputDialog( null,

s + " is not an integer. "

+ "Enter an integer" );


} while ( ! goodInput );



Write code to catch and handle exceptions generated by invalid user input.

Always try to write code that is user-friendly.

Although the methods of the Exception class are good debugging tools, they are not necessarily appropriate to use in the final version of a program.

Catching multiple exceptions
Catching Multiple Exceptions

If the code in the try block might generate multiple, different exceptions, we can provide multiple catch blocks to handle each possible exception.

When an exception is generated,the JVM searches the catch blocks in order.The first catch block with a parameter that matches the exception thrownwill execute; any remaining catch blocks will be skipped.

Catch block order
catch Block Order

An exception will match a catch block with a parameter that names any of its superclasses.

  • For example, a NumberFormatException will match a catch block with a RuntimeException parameter.

  • All exceptions will match a catch block with an Exception parameter.

    Thus, when coding several catch blocks, arrange the catch blocks with the specialized exceptions first, followed by more general exceptions.

Exception propagation
Exception Propagation

  • An exception can be handled at a higher level if it is not appropriate to handle it where it occurs

  • Exceptions propagate up through the method calling hierarchy until they are caught and handled or until they reach the level of the main method

  • A try block that contains a call to a method in which an exception is thrown can be used to catch that exception

The finally block
The finally Block

Optionally, you can follow the catch blocks with a finally block.

  • The finally block will be executed whether or not an exception occurs. Thus:

    • if an exception occurs, the finally block will be executed when the appropriate catch block finishes executing.

    • if no exception occurs, the finally block will be executed when the try block finishes.

  • For example, a finally block might be used to close an open file. We demonstrate this later.

Full try catch finally syntax
Full try/catch/finally Syntax



//code that might generate an exception


catch( Exception1Class e1 )


//code to handle an Exception1Class exception


catch( ExceptionNClass eN )


//code to handle an ExceptionNClass exception




//code to execute whether or not an exception occurs


Catching multiple exceptions1
Catching Multiple Exceptions

We can write a program that catches several exceptions.

For example, for a division operation, we can prompt the user for a divisor.

  • If the input is not an integer, we catch the NumberFormatException and reprompt the user with an appropriate message.

  • If the input is 0, we catch an ArithmeticException when we attempt to divide by 0, and reprompt the user with an appropriate message.

    See Example 11.4

Example 11 4
Example 11.4

// declare and initialize variables

int divisor = 0; int quotient = 0; int dividend = 100;

// initialize flag variable

boolean goodInput = false;

// prompt for input

String s = JOptionPane.showInputDialog( null, "Enter an integer divisor" );





// attempt to convert the String to an int

divisor = Integer.parseInt( s );

// attempt the division

quotient = dividend / divisor;

goodInput = true;


catch ( NumberFormatException nfe )


s = JOptionPane.showInputDialog( null, s + " is not an integer. “ + "Enter an integer divisor" );


catch ( ArithmeticException ae )


s = JOptionPane.showInputDialog( null, "Divisor cannot be 0. “ + "Enter an integer divisor" );


} while ( !goodInput );

JOptionPane.showMessageDialog( null, "The result is " + quotient );

User defined exceptions
User-Defined Exceptions

We can design our own exception class.

  • Suppose we want to design a class encapsulating email addresses (EmailAddress class).

    • For simplicity, we say that a legal email address is a String containing the @ character.

  • Our EmailAddress constructor will throw an exception if its email address argument is illegal.  

  • To do this, we design an exception class named IllegalEmailException.

User defined exception
User-Defined Exception

  • Java has an IllegalArgumentException class, so our IllegalEmailException class can be a subclass of the IllegalArgumentException class.

  • By extending the IllegalArgumentException class:

    • we inherit the functionality of an exception class, which simplifies our coding of the exception

    • we can easily associate a specific error message with the exception

Extending an existing exception
Extending an Existing Exception

We need to code only the constructor, which accepts the error message as a String.

General pattern:

public class ExceptionName extends ExistingExceptionClassName


public ExceptionName( String message )


super( message );



See Example 11.5

Example 11 5
Example 11.5

public class IllegalEmailException extends IllegalArgumentException


public IllegalEmailException( String message )


super( message );



The throw statement
The throw Statement

  • Exceptions are thrown using the throw statement

  • Usually a throw statement is executed inside an if statement that evaluates a condition to see if the exception should be thrown

Throwing an exception
Throwing an Exception

The pattern for a method that throws a user-defined exception is:

accessModifier returnType methodName( parameters ) throws ExceptionName


if ( parameter list is legal )

process the parameter list


throw new ExceptionName( "Message here" );


The message passed to the constructor identifies the error detected. In a client's catch block, the getMessage method retrieves that message.

See Examples 11.6 & 11.7

Example 11 6
Example 11.6

public class EmailAddress


public static final char AT_SIGN = '@';

private String email;

public EmailAddress( String newEmail ) throws IllegalEmailException


if ( newEmail.indexOf( AT_SIGN ) != - 1 )

email = newEmail;


throw new IllegalEmailException

( "Email address does not contain " + AT_SIGN );


public String getHost( )


int index = email.indexOf( AT_SIGN );

return email.substring( index + 1, email.length( ) );



Example 11 7
Example 11.7

public class EmailChecker


public static void main( String [ ] args )


Scanner scan = new Scanner( );

System.out.print( "Enter your email address > " );

String myEmail = );



EmailAddress address = new EmailAddress( myEmail );

System.out.println( "Your host is " + address.getHost( ) );


catch( IllegalEmailException iee )


System.out.println( iee.getMessage( ) );




I o exceptions
I/O Exceptions

  • Let's examine issues related to exceptions and I/O

  • A stream is a sequence of bytes that flow from a source to a destination

  • In a program, we read information from an input stream and write information to an output stream

  • A program can manage multiple streams simultaneously

Standard i o
Standard I/O

  • There are three standard I/O streams:

    • standard output – defined by System.out

    • standard input – defined by

    • standard error – defined by System.err

  • We use System.out when we execute println statements

  • System.out and System.err typically represent a particular window on the monitor screen

  • typically represents keyboard input, which we've used many times with Scanner objects

The ioexception class
The IOException Class

  • Operations performed by some I/O classes may throw an IOException

    • A file might not exist

    • Even if the file exists, a program may not be able to find it

    • The file might not contain the kind of data we expect

  • An IOException is a checked exception

Selected input classes in the java io package
Selected Input Classes in the Package

Selected java io output classes
Selected Output Classes

File types
File Types

  • Java supports two types of files:

    • text files: data is stored as characters

    • binary files: data is stored as raw bytes

  • The type of a file is determined by the classes used to write to the file.

  • To read an existing file, you must know the file's type in order to select the appropriate classes for reading the file.

Reading text files
Reading Text Files

In Chapter 6, we read a text file by associating a Scanner object with a File object:

Scanner file = new Scanner( new File( “filename.txt” ) );

We added the throws IOException clause to main to avoid handling exceptions that may occur.

public static void main( String [] args )

throws IOException

But when the file wasn’t found, a FileNotFoundException occurred; the user was given an unfriendly message; and the program terminated.

Now that we know how to catch exceptions, we can intercept the FileNotFoundException and give the user a meaningful message.

Opening and closing an inputstream
Opening and Closing an InputStream

  • When we construct an input stream or output stream object, the JVM associates the file name, standard input stream, or standard output stream with our object. This is opening the file.

  • When we are finished with a file, we optionally call the close method to release the resources associated with the file.

Opening and closing standard streams
Opening and Closing Standard Streams

The standard input stream (, the standard output stream (System.out), and the standard error stream (System.err) are open when the program begins.They are intended to stay open and should not be closed.



Calling the close method is optional. When the program finishes executing, all the resources of any unclosed files are released.

It is good practice to call the close method, however, especially if you will be opening a number of files (or opening the same file multiple times.)

Do not close the standardinput, output, or error devices, however. They are intended to remain open.

Exceptions while reading from a file
Exceptions While Reading from a File

We can catch this exception:

FileNotFoundException thrown by the Scanner constructor if the filename is not found when opening the file

We do not expect these exceptions to occur, so we will catch them as subclasses of IOException, and print the stack trace.

InputMismatchException if the input does not match the expected data type. (The next method does not throw this exception, so we don’t need to catch this exception).

NoSuchElementException if we attempt to read beyond the end of the file.

IllegalStateException if we attempt to read after calling the close method.

See Example 11.8

Writing to text files
Writing to Text Files

  • Several situations can exist:

    • the file does not exist

    • the file exists and we want to replace the current contents

    • the file exists and we want to append to the current contents

  • We specify whether we want to replace the contents or append to the current contents when we construct our FileOutputStream object.

Writing text files
Writing Text Files

  • Previously, we explored the use of the Scanner class to read input from a text file

  • Let's now examine other classes that let us write data to a text file

  • The FileWriter class represents a text output file, but with minimal support for manipulating data

  • Therefore, we also rely on PrintStream objects, which have print and println methods defined for them

Writing text files1
Writing Text Files

  • Finally, we'll also use the PrintWriter class for advanced internationalization and error checking

  • We build the class that represents the output file by combining these classes appropriately

  • Output streams should be closed explicitly

Writing primitive types to text files
Writing Primitive Types to Text Files

  • FileOutputStream, a subclass of the OutputStream class, is designed to write a stream of bytes to a file.

  • The PrintWriter class is designed for converting primitive data types to characters and writing them to a text file.

    • print method, writes data to the file without a newline

    • println method, writes data to the file, then adds a newline

Methods of the printwriter class
Methods of the PrintWriter Class

See Example 11.9 and Example 11.10

Reading structured text files
Reading Structured Text Files

Some text files are organized into lines that represent a record — a set of data values containing information about an item.

  • The data values are separated by one or more delimiters; that is, a special character or characters that separate one value from the next.

  • As we read the file, we need to parse each line; that is, separate the line into the individual data values called tokens.


An airline company could store data in a file where each line represents a flight segment containing the following data:

  • flight number

  • origin airport

  • destination airport

  • number of passengers

  • average ticket price

    Such a file could contain the following data:



    In this case, the delimiter is a comma.

Using scanner to parse strings
Using Scanner to Parse Strings

The Scanner constructor below accepts a String.

We can use any of the Scanner next methods to read tokens from the String.

We can use any of the Scanner hasNext methods to determine whether more tokens are available to be read.

The default delimiters are the white space characters (space, newline, tab, etc.).

Using scanner to parse strings1
Using Scanner to Parse Strings

To specify different delimiters, call useDelimiter method:

pattern represents a regular expression against which to match sequences of characters using standard characters as well as meta-characters, which have special meanings.

We can specify a delimiter consisting of a single character or multiple specific characters as a simple String argument.

See Example 11.11


The file flight.txt contains the following comma-separated flight data on each line:

flight number, origin airport, destination airport, number of passengers, average ticket price

The FlightRecord class defines instance variables for each flight data value

The ReadFlights class reads data from flights.txt, instantiates FlightRecord objects, and adds them to an ArrayList.

See Examples 11.12 and Example 11.13

The stringtokenizer class
The StringTokenizer Class

  • The StringTokenizer class is designed to parse Strings into tokens.

  • StringTokenizer is in the java.util package.

  • When we construct a StringTokenizer object, we specify the delimiters that separate the data we want to tokenize. The default delimiters are the whitespace characters.

Two stringtokenizer constructors
Two StringTokenizer Constructors

Useful stringtokenizer methods
Useful StringTokenizer Methods

Reading and writing objects
Reading and Writing Objects

Java also supports writing objects to a file and reading them as objects.

This is convenient for two reasons: 

  • We can write these objects directly to a file without having to convert the objects to primitive data types or Strings.

  • We can read the objects directly from a file, without having to read Strings and convert these Strings to primitive data types in order to instantiate objects.  

    To read objects from a file, the objects must have been written to that file as objects.

Writing objects to a file
Writing Objects to a File

To write an object to a file, its class must implement the Serializable interface, which indicates that:

  • the object can be converted to a byte stream to be written to a file

  • that byte stream can be converted back into a copy of the object when read from the file.

    The Serializable interface has no methods to implement. All we need to do is:

  • import the interface

  • add implementsSerializable to the class header

The objectoutputstream class
The ObjectOutputStream Class

The ObjectOutputStream class, coupled with the FileOutputStream class, provide the functionality to write objects to a file.

The ObjectOutputStream class provides a convenient way to write objects to a file.

  • Its writeObject method takes one argument: the object to be written.

The writeobject method
The writeObject Method

See Examples 11.15 FlightRecord2.javaand Example 11.16

Example 11 15
Example 11.15


import java.text.DecimalFormat;

public class FlightRecord2 implements Serializable


public static final DecimalFormat MONEY =

new DecimalFormat( "$###.00" );

private String flightNumber; // ex. = AA123

private String origin; // origin airport; ex. = BWI

private String destination; // destination airport; ex. = SFO

private int numPassengers; // number of passengers

private double avgTicketPrice; // average ticket price

/** Constructor

* @param startFlightNumber flight number

* @param startOrigin origin airport

* @param startDestination destination airport

* @param startNumPassengers number of passengers

* @param startAvgTicketPrice average ticket price


public FlightRecord2( String startFlightNumber, String startOrigin,

String startDestination, int startNumPassengers, double startAvgTicketPrice )


flightNumber = startFlightNumber;

origin = startOrigin;

destination = startDestination;

numPassengers = startNumPassengers;

avgTicketPrice = startAvgTicketPrice;


/** toString

* @return flight number, origin, destination, number of passengers, and average ticket price */

public String toString( )


return "Flight " + flightNumber + ": from " + origin

+ " to " + destination + "\n\t" + numPassengers + " passengers"

+ "; average ticket price: “ + MONEY.format( avgTicketPrice );


// accessors, mutators, and other methods …


Example 11 16
Example 11.16





public class WritingObjects


public static void main( String [] args )


// instantiate the objects

FlightRecord2 fr1 = new FlightRecord2( "AA31", "BWI", "SFO",

200, 235.9 );

FlightRecord2 fr2 = new FlightRecord2( "CO25", "LAX", "JFK",

225, 419.9 );

FlightRecord2 fr3 = new FlightRecord2( "US57", "IAD", "DEN",

175, 179.5 );



FileOutputStream fos = new FileOutputStream ( "objects", false );

// false means we will write to objects

ObjectOutputStream oos = new ObjectOutputStream( fos );

// write the objects to the file

oos.writeObject( fr1 );

oos.writeObject( fr2 );

oos.writeObject( fr3 );

// release resources associated with the objects file

oos.close( );


catch( FileNotFoundException fnfe ) {

System.out.println( "Unable to write to objects" ); }

catch( IOException ioe ) { ioe.printStackTrace( ); }



Omitting data from the file
Omitting Data from the File

The writeObject method does not write any object fields declared to be static or transient.

You can declare a field as transient if you can easily reproduce its value or if its value is 0.

Syntax to declare a field as transient:

accessModifier transient dataType fieldName


private transient double totalRevenue;



To save disk space when writing to an object file, declare the class's fields as static or transient, where appropriate.

Reading objects from a file
Reading Objects from a File

The ObjectInputStream class, coupled with FileInputStream, provide the functionality to read objects from a file.

The readObject method of the ObjectInputStream class is designed to read objects from a file.

Because the readObject method returns a generic Object,we must type cast the returned object to the appropriate class.

When the end of the file is reached, the readObject method throws an EOFException, so we detect the end of the file when we catch that exception.

The readobject method
The readObject Method

See Example 11.17

-- we detect reaching the end of the file in the catch block for EOFException

  • we use a finally block to close the file.

Example 11 17
Example 11.17






public class ReadingObjects {

public static void main( String [ ] args ) {

try {

FileInputStream fis = new FileInputStream( "objects " );

ObjectInputStream ois = new ObjectInputStream( fis );

try {

while ( true )


// read object, type cast returned object to FlightRecord

FlightRecord2 temp = ( FlightRecord2 ) ois.readObject( );

// print the FlightRecord2 object read

System.out.println( temp );


} // end inner try block

catch( EOFException eofe ) {

System.out.println( "End of the file reached" );


catch( ClassNotFoundException cnfe ) {

System.out.println( cnfe.getMessage( ) );


finally {

System.out.println( "Closing file" );

ois.close( );


} // end outer try block

catch( FileNotFoundException fnfe ) {

System.out.println( "Unable to find objects" );


catch( IOException ioe ) {

ioe.printStackTrace( );