Next: None. Up: Exceptions. Previous: Catching exceptions.
You can have your own code initiate an exception itself, using the throw statement.
The throw statement is structured similarly to a return statement - you have the word throw, followed by an expression, followed by a semicolon.throw new Exception("Hi there");
In this case, we've created a new Exception object, using the constructor that takes a string as its parameter. This sets of the message returned by the exception's getMessage() method.
Throwing an exception from a method is useful when you want to indicate that the exception failed. Until now, we've been doing this via return values, but this is problematic: It reduces the number of possible return values. (For example, IO.readInt() will return Integer.MIN_VALUE if the user types a non-number. But this effectively disallows the user from typing the integer value Integer.MIN_VALUE also.) And it allows people to write programs where they might unintentially ignore a potential problem. (You've probably been ignoring this case with IO.readInt().)
When you write a method that might throw an exception, you must include a throws clause to make it clear to the compiler that you didn't just fail to catch the exception.
public class IntArray { private int[] arr; private int arr_elts; // other method definitions public int remove() throws Exception { if(arr_elts == 0) throw new Exception("array is already empty"); --arr_elts; return arr[arr_elts]; } }
Actually, it's pretty rare that people write programs that throw Exception objects around. It's more frequent that they throw instances of other, more specific exceptions. The following alternative throws a NoSuchElementException object (defined in the java.util package)
Given this, then somebody who wants to catch the exception would catch a NoSuchElementException instead.import java.util.*; public class IntArray { private int[] arr; private int arr_elts; // other method definitions public int remove() throws NoSuchElementException { if(arr_elts == 0) throw new NoSuchElementException("array is already empty"); --arr_elts; return arr[arr_elts]; } }
(In fact, NoSuchElementException happens to be an unchecked exception, so catching it is optional.)public static void run() { IntArray array = new IntArray(); // : (omitting code that uses IntArray methods to add to array) try { array.remove(); } catch(NoSuchElementException e) { System.err.println("could not remove: " + e.getMessage()); } }
Next: None. Up: Exceptions. Previous: Catching exceptions.