11.1. Check the Temperature with Exceptions

To get started with exceptions, fork and clone this repository to your machine so you can code along. Inside the Temperature package, take a look at the Temperature class. We worked with this exact class when learning more about classes.

 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
public class Temperature {

    private double fahrenheit;

    public double getFahrenheit() {
        return fahrenheit;
    }

    public void setFahrenheit(double aFahrenheit) {

        double absoluteZeroFahrenheit = -459.67;

        if (aFahrenheit < absoluteZeroFahrenheit) {
            System.out.println("Value is below absolute zero");
        }

        fahrenheit = aFahrenheit;
    }
}

Instead of simply printing out a warning that the temperature is below absolute zero, let’s use exceptions to handle this case.

Before coding with exceptions, first think about what the exception needs to handle. In the case of our Temperature class, we need to throw an exception if the program attempts to set the value of fahrenheit to a temperature that is below absolute zero. The first question we need to ask about this exception is: when will it be thrown? Exceptions in Java can either be checked or unchecked depending on if the exception is a compile-time exception or a runtime exception. In the context of a larger program, setFahrenheit() is only called with a value that is given by a user. This means if we throw an exception when a value that is below absolute zero is passed to setFahrenheit(), it will be a runtime or unchecked exception.

Now that we know we are going to use a runtime exception, we need to answer the question: under what conditions should the exception be thrown? In our case, that is when we attempt to set fahrenheit to a value that is below -459.67. Based on our knowledge of builtin Java exceptions, we know that there isn’t a builtin exception that works for this, so now we need to build a custom exception.

Turn your attention to the TemperatureException class. Here is where we need to start coding. First, all custom exceptions must inherit from the Exception class.

3
4
5
public class TemperatureException extends Exception {
   // Write code here!
}

With the relationship between the two classes set up, we now need to add a constructor. In this case, that is all we need to add. We do not want to call the Exception class directly, so we will use TemperatureException to access its properties. The constructor will only have to deal with a message parameter.

4
5
6
public TemperatureException(String message){
     super(message);
 }

We now have a custom exception ready for use! Back in the Temperature class, we need to use this exception to prevent the temperature from being set to a value that is below absolute zero. You may be tempted to just throw the exception if the value is below absolute zero, like so:

15
16
17
if (aFahrenheit < absoluteZeroFahrenheit) {
   throw new TemperatureException("That temperature is too low!");
}

However, if you do this, you will get an error in IntelliJ. You get this error because, in Java, we must handle every exception that is thrown. We need to encase our exception in a try/catch block. We want to try to throw the exception and if we catch the error, we want to print the stack trace.

15
16
17
18
19
20
21
if (aFahrenheit < absoluteZeroFahrenheit) {
   try {
         throw new TemperatureException("That temperature is too low!");
   } catch (TemperatureException e) {
         e.printStackTrace();
   }
}

Now run the program and try to enter a value below absolute zero!

11.1.1. Check Your Work

Check out the end-of-walkthrough branch on Github to make sure your code is correct.