zoukankan      html  css  js  c++  java
  • Java笔记

           JAVA异常机制是Java提供的用于处理程序在运行期可能现的异常事件(如数组下标越界、文件不存在等)的一种机制,使程序不会因为 异常的发生阻断或产生不可预见的结果 。而且还可以将逻辑代码错误处理代码分开,使程序员无需考虑较复杂的例外情况。

    一、异常继承架构

         JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。Throwable类分为 Error错误Exception异常Error是由Java运行时系统内部错误和资源耗尽错误,这类错误是我们无法处理的。包括设备错误、动态链接失败、虚拟机错误等。

         Exception是所有异常类的父类,其子类对应各种各样肯出现的异常事件, RuntimeException异常非RuntimeException异常自定义异常,Exception异常一般需要程序员显示的声明或捕获。

                 image                 

    1、运行时异常

        RuntimeException是运行时异常,这类错误通常是由编程错误引起的,产生比较频繁,如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序,此类异常可以不捕获。如:ArithmeticException、NUllPointException、ClassCastException、ArrayIndexOutOfBoundsException、NumberFormatException等。

      1 //当被除数为0时,引起ArithmeticException
      2 int a = 1/0;
      3 
      4 //访问null对象的成员变量或方法时,NullPointerException
      5 Integer b = null;
      6 b.toString();
      7 
      8 //访问的元素下标超过数组长度,ArrayIndexOutOfBoundsException
      9 int [] c = {1,2,3};
     10 System.out.println(c[4]);
     11 
     12 //数字格式异常,NumberFormatException
     13 Integer d = new Integer("123e");
     14 
     15 //类型转换错误,ClassCastException
     16 //可以用instanceof 运算符判断对象是否是特定类的一个实例
     17 Thread e = (Thread)new Object();


    2、非运行时异常

         非RuntimeException异常也是运行时异常,但必须捕获,否则会引起编译错误。如IOException、ClassNotFoundException、InterruptException等。         

    3、自定义异常

         在程序中。可能会遇到标准异常类都没有充分的描述清楚的问题,这种情况下可以自定义异常类。定义的类应该包括两个构造器,一个是默认构造器,一个是带有详细信息的构造器。自定义异常的生成步骤如下:

              ① 继承 Exception类 、 RuntimeException类 其子类并定义相关的异常事件信息属性以及方法。

              ② 在方法适当的位置生成自定义异常的实例,并用throw语句抛出

              ③ 在方法的声明部分用throws语句声明该方法可能抛出的异常。

      1 //自定义非RuntimeException
      2 class MyException extends Exception{
      3 	private int msg;//出错信息
      4 	private int num;//自定义编号
      5 
      6 	public MyException() {
      7 		super();
      8 	}
      9 	public MyException(String msg,int num) {
     10 		super(msg);
     11 		this.num = num;
     12 	}
     13 
     14 	public int getNum() {
     15 		return num;
     16 	}
     17 }

    二、异常的捕获与处理

      Java采用面向对象的方式处理异常,处理有 捕获catch抛出throw 两种方式。程序在执行过程中若出现异常事件,将异常事件的信息封装成异常类对象,并抛出throw给java运行时系统。JRE会终止当前程序正常的执行流程,根据获取异常对象的类型(或父类异常类型)去执行处理这一异常的相应捕获catch代码段。

               image

          若没有找到,则JRE会沿着函数被调用的顺序往前抛出异常直至找到符合该异常类型的catch语句,给若都没有找到,JVM会默认打印出异常的堆栈信息。

                                        image

    1、try catch语句

    (1)语法格式    

           try代码段可能产生一种或几种类型的异常对象,每一个try语句具有一个或多个catch语句,每一个catch语句提供一种异常类型的处理方法。当异常处理的代码执行完后,是不会回到try语句去执行尚未执行的代码。

      1 try {
      2     //可能抛出异常(例外)的代码
      3 }catch(SomeException e1){
      4     //异常e1的处理方法
      5 }catch(SomeException e1){    
      6     //异常e2的处理方法
      7 }finally{
      8     //关闭资源
      9 }

    (2)catch异常类型

           如果异常类之间有继承关系, try语句块中,父类异常的捕获语句不可以写在子类异常捕获语句的前面,否则会引起编译错误。另外,建议为不同类型的异常都作出相应处理,而不是只声明大类异常。

      1 FileInputStream in = null;
      2 
      3 try {
      4 	in = new FileInputStream("file.txt");
      5 	int b = in.read();                    //可能发生FileNotFoundException 
      6 	 while (b != -1) {
      7 		 System.out.print((char) b);
      8 	 	 b = in.read();
      9 	 }
     10 } catch (FileNotFoundException e) {       //子类异常
     11 	  System.out.println(e.getMessage());
     12 
     13 } catch (IOException e) {                 //父类异常
     14 	e.printStackTrace();
     15 } finally {                               //关闭打开的资源
     16 	try {
     17 		if(in != null )  in.close();  //防止出现NullPointerException
     18 	 } catch (IOException e) {
     19 		e.printStackTrace();
     20 	}
     21   }

    (3)异常事件信息 

           异常对象中封装了异常事件发生的信息,可以使用异常对象的构造器设定异常出错信息,并在catch语句中使用异常对象的方法获取这些信息,如:

      1 //这些方法均继承Throwable类
      2 toString()方法:显示异常类名和产生异常的原因
      3 getMessage()方法:只显示产生异常的原因,但不显示类名
      4 printStackTrace()方法:用来跟踪异常事件发生时执行堆栈的内容

    并提供捕获

    2、throw与throws语句

    (1)异常声明throws语句

           若一个方法可能抛出多个非RuntimeException异常,不一定非要立即使用catch语句进行处理,对于目前无法处理的异常,还可以在方法的首部声明该方法可能抛出的所有的异常(声明其父类亦可),将异常交于调用它的方法处理,声明的异常之间使用逗号隔开。

      1 	public static void f()throws IOException,Exception{
      2 		int a = 2/0;             //运行时异常,可以不throws声明
      3 		throw new IOException(); //非运行期异常,必须throws声明
      4 	}

    (2)手动抛出异常throw语句

          Java异常对象除了程序执行过程中出现异常时由系统自动生成抛出,也可以手动创建并throw抛出Exception异常,或 自定义异常。

      1 	public static void f(){
      2 			try {
      3 				throw new IOException("出现IO异常");
      4 			} catch (IOException e) {
      5 				// TODO Auto-generated catch block
      6 				e.printStackTrace();
      7 			}
      8 	}
    

    在捕获一个异常前,必须有一段代码先生成异常对象并抛出,这个过程我们可以手动做,也可以由JRE来实现,但是他们调用的都是throw子句。

    (3)方法重写中声明异常原则

            重写方法需要抛出 与原方法异常类型一致  或  不抛出异常

       image

    3、使用异常机制的建议

         ①  只在异常的情况下使用异常机制,要避免使用异常机制代替错误处理、简单的测试程序等,这样会降低程序的清晰性,并且效率低下。

          ② 不要进行小粒度的异常处理,应该讲整块可能出现异常的语句都放在同一个try代码块中。

          ③ 异常往往在高层处理,不建议在底层处理异常

    三、异常与资源处理


    1、finally语句

           finally语句为异常处理提供了统一的出口,无论try代码段是否有异常发生,finally代码段都会执行。finally语句可以在控制流程在转到程序其他部分之前,对程序的状态作统一的管理,如进行关闭打开的文件、删除临时文件、释放数据库连接等资源清除工作。


    2、自动关闭资源


    3、AutoCloseable接

  • 相关阅读:
    根据用户输入的时间查询那天的数据
    动软 生成 linq相关DAO
    pdf 移除密码 去除水印 批量去除水印 编辑文字 批量替换文字
    利用OCR识别扫描的jpg、tif文件的文字
    jstat命令详解
    IDEA自动编译设置
    IntelliJ IDEA:Field injection is not recommended
    阿里巴巴Druid数据库连接池配置详解及使用
    com.mysql.jdbc.Driver和com.mysql.cj.jdbc.Driver的区别
    Java对元与分的金额的转换
  • 原文地址:https://www.cnblogs.com/sh086/p/8289439.html
Copyright © 2011-2022 走看看