As javadoc said:
RuntimeException is a superclass of those exceptions that may be thrown during the normal operation of the Java virtual machine. the method does not need to declare in its throws article any subclasses of RuntimeException that can be thrown at runtime but not caught.
Author (s): Frank Yellin
Since: JDK1.0
Now, back to your question, I wonder if the difference is defined inside the interpreter itself? .... the magic trick is performed inside the bytecode .
The following article demonstrates this by analyzing bytecode:
http://www.javaworld.com/article/2076868/learn-java/how-the-java-virtual-machine-handles-exceptions.html
The main mecanism is the exception table:
Exception table: from to target type 0 4 4 <Class java.lang.ArithmeticException>
If an exception is thrown during the execution of the method, the Java virtual machine searches the exception table for the corresponding record.
An exception table entry matches if the current program counter is within the range indicated by this entry, and if the class of the excluded class is the exception class specified in the record (or is a subclass of the specified exception class).
The Java virtual machine searches the exception table in the order in which the entries appear in the table. When the first match is found, the Java virtual machine sets the program counter to the new location of the PC offset and continues execution there.
If no match is found, the Java virtual machine pops the current stack stack and raises the same exception.
When the Java virtual machine pops the current stack stack, it actually interrupts the execution of the current method and returns the method that called this method. But instead of the usual execution of the previous method, it throws the same exception in this method, which causes the Java virtual machine to go through the same search process on the exception table of this method.
source share