zoukankan      html  css  js  c++  java
  • java笔记异常详解与处理

    一、异常概念

       Throwable类是Java中所有错误或异常的超类。


        1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出。
        2.只有此类或其子类才可以是catch字句中的参数类型。
        3.有两个直接子类:Error和Exception
            Error--指应用程序不应该去处理捕获的一种严重问题,常表示系统级的错误,如内存溢出
           Exception--指程序需要捕获,需要处理的异常,是一种设计或实现方面的问题。
                Exception分为两类:RuntimeException和CheckedException
                   RuntimeException--运行时异常,由程序员错误导致,不需要捕获处理,直接由
                                虚拟机接管,层层上抛,记录日志,程序员应尽量避免此种异常。
                    CheckedException--一般异常,需要进行catch,如IO异常和SQL异常等。
                    
            注:Error是不需要程序员关心的,属于系统级的错误
                 RuntimeException需要程序员注意逻辑和编码上的谨慎,尽量避免此种错误发生
                 CheckedException需要进行捕获处理
        

       
        --支持知识共享,转载请标注地址"http://www.cnblogs.com/XHJT/p/3927577.html  "——和佑博客园,谢谢~~--    
       
    二、常见的RuntimeException异常:

       1.ArithmeticException 算数异常--如最常见的除数为0
       
        2.ArrayindexOutOfBoundsException 数组下标越界异常,但需要遍历数组时,用foreach或者ArraryList可避免此异常。
       
        3.ClassCastException 强制转换异常
       
        4.ClassNotFoundException 找不到指定类异常,此类异常常发生于以下几种情况,
                                              如:Class类中的forName方法
                                                   ClassLoader类中的findSystemClass方法
                                                   ClassLoader类中的loadClass方法
                                   
        5.NullPointException 空指针异常,当应用程序试图在需要对象的地方使用null时,抛出此异常:
                                      如:调用null对象的实例方法
                                           访问或修改null对象的字段
                                           将null作为一个数组,获得其长度
                                           将null作为一个数组,访问或修改其元素值
                                           将null作为Throwable值抛出
                                      要避免此类异常可在定义引用类型变量就对其初始化,或者在使用此变量进行是否为空判断。
       
        6.ArrayStoreException 数组存值异常--即元素类型不一致时抛出此异常,但若数组引用类型为Object则不会抛出此异常。
     

     
    三、其他常见异常
       
       1.IllegalAccessExcetion 非法访问异常--是当应用程序试图反射性地创建一个实例(而不是数组)、设置或获取一个字段,
                                           或者调用一个方法,但当前正在执行的方法无法访问指定类、字段、方法或构造方法的定义时
                                           抛出的异常。
                                           此异常最常见是在有安全管理器下使用反射设置私有域的值。此时必须要使用setAccessible()修改
                                           其可见性。一般而言,尽量避免使用反射来访问私有域。
                           
        2.FileNotFoundException 文件未发现异常--在试图打开指定路径名表示的文件失败时抛出的异常。在不存在具有指定路径
                                         名的文件时,该异常有FileInputStream、FileOutputStream和ReadomAccessFile构造方法抛出。
                                         若此文件存在,却由于其他原因不可访问,将抛出此异常。如打开一个只读文件进行写入。
                                         要避免此类异常,可先通过File类的exists()方法来判断此文件是否存在。也可使用文件选择器,把
                                         可操作的文件均罗列出来。
       
        3.SqlException 数据库异常--提供关于数据库访问错误或其他错误信息的异常。通过此异常可知道:
                            a.描述错误的字符串;
                            b."SQLstate"字符串,该字符串遵守XOPEN SSQLstate约定或SQL:2003约定
                            c.特定于每个供应商的整数错误代码。
                            d.到下一个Exception的链接
                            e.因果关系,可查出任何导致此SQLException的原因

    四、对异常的处理

    throw:
        使用throw关键字可以在方法体中抛出异常。该异常既可以使系统预定义异常,也可是用户自定义异常;
        throw总是出现在函数体中,用来抛出一个具体异常。程序会在throw语句后立即终止,它后面的语句执
        行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子
        句的try块:
       
            throw 异常对象;
            此时要抛出异常必须要应用在方法体中。

    throws:
        使用throws关键字可能会抛出异常;该异常既可以使系统预定义异常,也可是用户自定义异常;
        throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。对大多数Exception
        子类来说,Java 编译器会强迫你声明在一个成员函数中抛出的异常的类型。如果异常的类型是
        Error或 RuntimeException, 或它们的子类,这个规则不起作用, 因为这在程序的正常部分中
        是不期待出现的。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的
        类型。
       
            [<修饰符>]<返回值类型><方法名>([<参数列表>])[throws<异常类>]
           注:异常类可以声明多个,用逗号分割。
       
       
    throw和throws的区别:
        1.前者在方法体中使用,是一个语句,用于抛出具体的异常;后者在声明方法时使用,是一个方法,用于声明可能抛出的异常。
        2.前者不能单独使用,要么和try-catch-finally配套,要么和throws配套;后者可单独使用。
        3.使用前者,则一定会抛出异常,使用后者则可能会抛出异常
        4.程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻
          找含有与其匹配的catch子句的try块。   
         
    为预定于异常添加提示信息:
       
        对于系统预定义的异常,一般而言至少有两个构造函数,即有参构造和无参构造。程序员可以使用有参构造方法来添加提示 信息。


        代码实例:

    package com.xhj.exception;
    
    /**
     * 为预定于异常添加提示信息:
     * 
     * @author XIEHEJUN
     * 
     */
    public class AddExceptionMessage {
    
        public static void throwException() {
            throw new UnsupportedOperationException("没有任何数据");
        }
    
        public static void main(String[] args) {
            try {
                AddExceptionMessage.throwException();
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    
    }
    用户自定义异常:


        虽然Java本身定义的异常类已经十分的丰富齐全,但是在实际应用当中,需求总是千变万化的。
        当需求需要而Java预定义异常类中却没有时,编程人员可通过自定义异常类来满足开发需求。
       
        要编写一个自定义的异常类很简单,只需要继承Exception类或其子类,然后实现其构造方法即可。
           public class MyException extends Exception{}
           
       代码实例:

    package com.xhj.exception;
    
    /**
     * 自定义异常
     * 
     * @author XIEHEJUN
     * 
     */
    public class MyDefinedException extends Exception {
    
        public MyDefinedException(String message) {
            super(message);
    
        }
    
        public static void main(String[] args) throws MyDefinedException {
            
            String[] str = { "1", "2", "3", "4", "5", "6" };
            for (String string : str) {
                if (string.equals("6")) {
                    throw new MyDefinedException("此数据不能大于其字节长度!");
                }
            }
            
        }
    
    }

    捕获异常:

    当遇到异常,我们一般有两种解决方案:一种当然是将异常抛出;另外一种就是将异常捕获
    抛出异常是一个很简单的行为,但是这个简单的行为将会让程序直接退出。而在实际需求当中,
    并不是什么异常都能抛出的,因为不管怎么样,我们总是要保持程序处于运行状态的,不然也就没有什么意义了。

        异常的捕获要通过try--catch--finally语句块来完成:


        1.try是不可缺少额语句块,主要用来放置可能出现异常的语句;
        2.catch和finally两者至少要有一个1个与try配套;
        3.catch块是用来放置异常发生后的处理语句;
        4.finally里放置的则是无论发生异常与否都会执行的语句。
       
        注:对异常进行捕获会占用很高的内存,因此try块中的语句要尽量少。
       
       try--catch--finally的执行顺序:
       
        实例代码:

    package com.xhj.exception;
    
    /**
     * 认识try--catch--finally的执行顺序
     * 
     * @author XIEHEJUN
     * 
     */
    public class ExecuteExceptionShort {
    
        public static void main(String[] args) {
            String[] strs = new String[5];
            try {
                int i = strs.length;
                System.out.println("----进入try代码块----");
                System.out.println("String数组大小为:" + i);
                String str = "我是丑小鸭!";
                strs[5] = str;
                System.out.println("strs[5] = " + strs[5]);
                System.out.println("----离开try代码块----");
            } catch (Exception e) {
                System.out.println("----进入catch代码块----");
                System.out.println("异常为: " + e.toString());
                System.out.println("----离开catch代码块----");
            } finally {
                System.out.println("----进入finally代码块----");
                strs[4] = "我是美丽的白天鹅";
                System.out.println(strs[4]);
                System.out.println("----离开finally代码块----");
            }
    
        }
    
    }


    注:try--catch--finally语句块可捕获多个异常,但是在捕获多个异常的时候一定要注多个catch的执行顺序,
    所要捕获的异常一定要从小到大排列。当然也可直接通过所有异常的父类Exception,来简单处理。

    知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。由于本人进阶猿类时间尚短,故此博客即是我学习,工作的笔记,也是和大家交流,相互提升技术的平台~希望大家不吝赐教~~ --但管努力,莫问前程,事在人为,功不唐捐。--和佑博客园
  • 相关阅读:
    CodeForces 785D Anton and School
    CodeForces 785C Anton and Fairy Tale
    CodeForces 785B Anton and Classes
    CodeForces 785A Anton and Polyhedrons
    爱奇艺全国高校算法大赛初赛C
    爱奇艺全国高校算法大赛初赛B
    爱奇艺全国高校算法大赛初赛A
    EOJ 3265 七巧板
    EOJ 3256 拼音魔法
    EOJ 3262 黑心啤酒厂
  • 原文地址:https://www.cnblogs.com/XHJT/p/3927577.html
Copyright © 2011-2022 走看看