Question: Exceptions Arent Always Errors Background knowledge needed: All characters are fundamentally saved as integers. File CountLetters.java contains a program that reads a word from the
Exceptions Arent Always Errors
Background knowledge needed: All characters are fundamentally saved as integers.
File CountLetters.java contains a program that reads a word from the user and prints the number of occurrences of each letter in the word. In reading the code, note that the word is converted to all uppercase first, then each letter is translated to a number in the range 0 25 (by subtracting A) for use as an index.
1. Run CountLetters and enter a phrase, which contains only letters.
2. Run the program again with both letters and nonletters. Insert such as spaces, or other punctuation in between the letters. It should throw an ArrayIndexOutOfBoundsException, because a nonletter will generate an index that is not between 0 and 25.
3. Now lets handle the nonletters. It might be desirable to allow non-letter characters, but not count them. Of course, you could explicitly test the value of the character to see if it is between A and Z. However, an alternative is to go ahead and use the translated character as an index, and catch an ArrayIndexOutOfBoundsException if it occurs. Since you dont want to do anything when a nonletter occurs, the handler will be empty. Modify this method to do this as follows:
- Put the body of the first for loop (not entire for loop, why?) in a try.
- Add a catch that catches the exception, but dont do anything with it.
- Compile and run your program.
4. Now modify the body of the catch so that it prints a useful message (e.g., Not a letter) followed by the exception. Compile and run the program.
5. In your print statement, replace the exception with the character that created the out of bounds index. Run the program again; much nicer!
// ****************************************************************
// CountLetters.java
//
// Reads a words from the standard input and prints the number of
// occurrences of each letter in that word.
//
// ****************************************************************
import java.util.Scanner;
public class CountLetters
{
public static void main(String[] args)
{
int[] counts = new int[26];
Scanner scan = new Scanner(System.in);
//get word from user
System.out.print("Enter a single word (letters only, please): ");
String word = scan.nextLine();
//convert to all upper case
word = word.toUpperCase();
//count frequency of each letter in string
for (int i=0; i < word.length(); i++)
try{
counts[word.charAt(i)-'A']++;
}
catch(ArrayIndexOutOfBoundsException exception)
{
System.out.println(word.charAt(i)+" Not a letter");
}
//print frequencies
System.out.println();
for (int i=0; i < counts.length; i++)
if (counts [i] != 0)
System.out.println((char)(i +'A') + ": " + counts[i]);
}
}
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
