Most of the time, if I want to terminate the execution of the program at a certain critical point, I just create a RuntimeException with some informational messages:
throw new RuntimeException("ERROR: this is wrong! Fix it first!")
In Java there are lots of different built-in exception types, and books also teach how to create your own custom exception types. Is that really necessary? Isn't a RuntimeException sufficient for most purposes from a practical point point of view?