图示例子本来就是教你区别异常的类型:Exception表示明确要求使用者进行检查的代码。既然要求你检查,前提是被调用的代码明确声明了会抛出这种异常。图2中b方法抛出一个非运行时异常,而没有声明。所以不能编译。JLS要求所有非运行时异常必须声明。意思是告诉调用者,我可能会丢个惊喜给你,你必须处理。处理的方法有两种:1,继续声明这种类型的异常,然后直接调用,不管。2,逮住这个鬼东西,收拾它。 图1中的算数异常属于运行时异常,可理可不理。是否声明都大滚可以。抓了,不会再向上的调用栈进行滚团余传递。不抓,一般是当前线程的默认处理,线程停止或凯运行。注意:图2中catch(Exception)将逮住所有异常,不管是普通的Exception还是RuntimeException。 另外:虽然RuntimeException也是Exception的子类。但是编译器会明确区分。实际上这是一个设计错误。 不要去听别人的翻译:什么检查异常,已检查异常。纯粹属于语文没有学好的人胡乱翻译。