• 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,来简单处理。

    知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。由于本人进阶猿类时间尚短,故此博客即是我学习,工作的笔记,也是和大家交流,相互提升技术的平台~希望大家不吝赐教~~ --但管努力,莫问前程,事在人为,功不唐捐。--和佑博客园
  • 相关阅读:
    [java]Java中父类强制转换成子类的原则
    基于 JWT + Refresh Token 的用户认证实践
    [java]idea设置及debug使用
    [java]Class类和Object类的关系
    [java]文件操作
    [java]javabean
    [java]string类型
    [java]求数据的hmac sha1的并用base64编码
    java 多线程——一个定时调度的例子
    设计模式 4 —— 迭代器和组合模式(组合)
  • 原文地址:https://www.cnblogs.com/XHJT/p/3927577.html
Copyright © 2020-2023  润新知