站稳马步——(9)java异常处理

一.总体看下JDK的异常层次关系,如下UML图:

 

二.看一段代码说明:

package com.test; /** * *@author: ydj *@createTime: Nov 15, 2010 10:49:40 AM * */ public class TestException { private final static class CheckedException extends Exception{ } private final static class UncheckedException extends RuntimeException{ } void testUncheckedException(int s){ throw new IllegalArgumentException("参数错误");//运行时异常(不可检查异常),在方法名后无需申明抛出(throws)异常 } static void testException(boolean is) throws CheckedException{ if(is){ throw new CheckedException(); //受检查异常,在方法申明中必须throws }else{ throw new UncheckedException(); } } @SuppressWarnings("finally") static int test(int in){ int i=-1; try{ i=2/in; Log.info(i);//A return i; }catch(ArithmeticException e){ Log.info(e.getMessage());//B }finally{ return 0;//如果此处加了return,那么A、B处将均不执行(同时说明:finally语句块在try中出现异常返回之前执行) } //这里已经不可以再有代码,否则编译不通过 } /** * @param args * @throws CheckedException */ public static void main(String[] args) throws CheckedException { // TODO Auto-generated method stub Log.info(test(0)); testException(true);//这里可以不通过try{}catch(){}处理,可以继续通过throws传递异常 } }

 

三.总结说明:

1.Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的

 

2.在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。

 

3.不能在finally块中执行return,continue等语句,否则会把异常吃掉”;

 

4.trycatch中如果有return语句,则在执行return之前先执行finally块;

 

5.对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常(不要把自己能处理的异常也抛给调用者);

 

6.throw语句后不允许有紧跟其他语句,因为这些没有机会执行;

 

注意:

1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的 异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。

 

 

你可能感兴趣的:(java,jdk,exception,String,Class,UML)