为什么会区分这两种异常?第一种异常是因为Java设计者认为有些异常使用者能够处理,这就是编译异常(非RuntimeException子类的异常),你要么自己catch处理,也可以抛给虚拟机,总之你需要知道这个异常警示。
非RuntimeException子类的异常是Java语言设计者认为很有可能出错的情况下,提前在编译时期就警告用户的一种机制。这种异常在编译时期就会报错,我们必须在编译的时候进行处理,要么try要么抛出,调用的方法如果抛出了,那么调用这个方法的方法(可能是主方法)要么try或者抛出,如果一路抛出,并不是解决问题,只是逃避了解决方法,交给了虚拟机去解决,只有try catch是真正的手动解决问题。比如DateFormat类中的parse方法:
public Date parse(String source) throws ParseException
这种情况应对了Java语言中的异常机制,因为这里很容易犯错,只要给出的字符串日期格式有一点不同,就会出错,所以Java语言设计了一种异常:ParseException提醒用户在编译的时候就必须要处理,try或者抛出,人工try的话可以在真的出现这种错误之后不阻断后面的语句。而另一种处理方法抛出异常是回避人处理错误,将错误交给虚拟机处理,虚拟机遇到错误就会中断,影响后面的程序执行。