泛不系舟

天行健,君子以自强不息;地势坤,君子以厚德载物。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,java就会用异常对象来描述。

Java中用2中方法处理异常:
1、在发生异常的地方直接处理;
2、将异常抛给调用者,让调用者处理;

异常分类:
1、检查性异常:java.lang.Exception,程序正确,是因为外在的环境条件不满足引发,例如:用户错误、I/O问题、网络端口、文件不存在等等;
2、运行期异常:java.lang.RuntimeException,程序存在bug,例如:数组越界,0被除,入参不满足规范......这类异常需要更改程序来避免,java编译器强制要求处理这类异常。
3、错误:java.lang.Error,一般很少见,也很难通过程序解决,它可能源于程序的bug,但一般更可能源于环境问题,如内存耗尽。错误在程序中无须处理,而由运行环境处理。
顶层是java.lang.Throwable类,检查性异常、运行期异常、错误都是这个类的子孙类。

异常示例:

        //打开文件
        FileReader fr=new FileReader("d:\\aaa.txt");
        //连接一个192.168.12.12,端口号4567
        Socket s=new Socket("192.168.12.12",4567);
        //运行期异常
        int a=4/0;
        //数组越界
        int arr[]={1,2,3};
        System.out.println(arr[123]);        

异常处理
1、try...catch,程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。

        int x = (int) (Math.random() * 5);
        int y = (int) (Math.random() * 10);
        int z[] = new int[5];
        try {
            System.out.println("y/x=" + (y / x));
            System.out.println("y=" + y + "z[y]=" + z[y]);
        } catch (ArithmeticException exc1) {
            System.out.println("算术运算异常:" + exc1.getMessage());
        } catch (ArrayIndexOutOfBoundsException exc2) {
            System.out.println("数组越界异常:" + exc2.getMessage());
        }

2、finally,如果把finally块置try...catch...语句后,finally块一般都会得到执行,它相当于一个万能的保险,即使前面的try块发生异常,而又没有对应异常的catch块,finally块将马上执行。

        FileReader fr = null;
        try {
            fr = new FileReader("d:\\aaa.txt");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

以下情况finally块将不会被执行:

①finally块中发生了异常;
②程序所在线程死亡;
③在前面的代码中用了System.exit();
④关闭CPU;

posted on 2015-10-13 11:25  惊蝴蝶  阅读(199)  评论(0编辑  收藏  举报