Because the Java language does not require methods to catch or specify runtime exceptions, it's tempting for programmers to write code that throws only runtime exceptions or to make all of their exception subclasses inherit from RuntimeException. While this may seem convenient to the programmer, it sidesteps the intent of Java's catch or specify requirement and can cause problems for the programmers using your classes. The exceptions that a method can throw are as much a part of that method's programming interface as its parameters and return value. Runtime exceptions represent problems that are detected by the runtime system.
Runtime exceptions can occur anywhere in a program and in a typical program can be very numerous.
Typically, the cost of checking for runtime exceptions exceeds the benefit of catching or specifying them. Thus the compiler does not require that you catch or specify runtime exceptions, though you can. Simply, you get the ability to throw an exception without specifying that you do so. In other words, it is a way to avoid documenting the exceptions that a method can throw. A method can detect and throw a RuntimeException when it's encountered an error in the virtual machine runtime, however, it's typically easier to just let the virtual machine detect and throw it.