Exception笔记

前言:

本文章是针对我的学习所做的一些笔记,以及对知识点的测试

知识点分部讲解:

1.基本概述

1.异常以类对象的方法存在,当程序某段代码发生异常,会产生异常对象
2、异常的分类
两类型又有相应的子类
2.1:Exception 的子类为: RuntimeException(运行异常) 可处理,也可不处理,
IOException(受检异常):必须处理,不然报错 ,该两类下又有相应具体的子类 2.2:Error 子类参考文档

2.处理异常的方法

// 当出现异常有两种处理方法:
//1 .通过throws 往上抛异常,直到被解决为止
//2 .通过 try catch语句 直接捕获异常,进行处理,
//2.1 当try语句块中有多个异常可以,增加多个catch块,分别解决各个异常
// 相关例子在: TestException 类中

// 测试处理异常出现的两种方法:
// 1.throws :()
// 2.try {} catch (异常类 变量){}:
/* try{ 语句1;
        抛出异常语句
        语句2     }   语句2不执行,直接转跳执行 catch 语句块*/
// 2.1 catch语句可以捕捉该异常的父类(这是多态原理,父类引用指向子类对象)

// 什么时候决定throws ,什么时候决定 try catch,根据具体情况而定,
// 例如想让上一级调用者知道就throws向上抛出,不想则就地解决,try catch

import java.io.IOException;

public class TestException {
    public static void main(String[] args) {
        System.out.println("main beg!");
        m1();

        System.out.println("main end!");
    }

    public static void m1() {
        System.out.println("m1 beg!");
        m2();
        System.out.println("m1 end!");
    }

    private static void m2() {
        System.out.println("m2 beg!");
        m3();
        System.out.println("m2 beg!");
    }

    private static void m3() {
        System.out.println("m3 beg!");
        // 直接在抛出异常除直接捕获异常,并对其处理
        try {
            throw new ClassNotFoundException("sadasdsads");// 抛出一个受检异常
        } catch (ReflectiveOperationException e) {  // catch 对象也可以写为该对象的  父类ReflectiveOperationException
            // 为ClassNotFoundException的父类
            System.out.println("处理了奥");
        }
    }
}

3.finally关键字

finally{}语句块
finally{}语句块一定与try{} catch 并用,放在catch(){}之和
相关例子在: TestException02 类中

//-------------知识点
//1.当打开输入流时候,即new 出输入流类对象后,在使用完后需要将其 关闭,即调用  输入流对象.close()方法将其关闭,不然会耗内存
//2. 用try{} catch(异常类 a){} 处理异常时候,要习惯性在 catch语句块加上 a.printStackTrace() 输出异常错误信息(方便寻找)
//3. 当出现异常时 :查找错误信息,前面 SUN公司写的代码就不用看了,直接看到我们写的代码 ,从第一句看起******
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class TestException02 {
    public static void main(String[] args) {
        System.out.println("main beg!");
        m1();

        System.out.println("main end!");
    }

    public static void m1() {
        System.out.println("m1 beg!");
        m2();
        System.out.println("m1 end!");
    }

    private static void m2() {
        System.out.println("m2 beg!");
        m3();
        System.out.println("m2 beg!");
    }

    private static void m3() {
        FileInputStream s=null;// 定义一个输入流类变量
        try {
            s=new FileInputStream("D:\\公选课笔记\\劳动法\\标志劳动法产生的法律.png");// new 输入流对象,调用父类构造方法,
                                                                                    // throws一个FileNotFoundException异常
            System.out.println("m3未发生异常!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {   // finally 关键字
            if (s!=null){
                try {
                    s.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

        }

    }
}

// 五、try {} 和 finally 可以并用,不加catch语句也行,当try{}中有return 语句时候的执行情况
// 执行顺序为 :return 语句之前的语句先执行,再执行 finally {}内的语句,最后执行 return
// 相关例子在 : TestException03 类中

// 以下例子为啥输出100,而不是101的原因是:
// 1.程序的代码由上往下执行(亘古不变)
// 2.最后才执行return (这是SUN公司)规定的:try 和finally连用加上return语句
// 3.为了同时满足以上两个原因,SUN公司定义一个临时变量j,将i=100赋给j,返回的值为 j的值
public class TestException03 {
    public static void main(String[] args) {
        System.out.println(m1());

    }

    public static int  m1(){
        int i=100;
        try {
            System.out.println("m1()方法beg!" );
            return i;
        }finally {
            i++;
            System.out.println("finally块中执行");
        }

    }
}

4.自定义异常类

// 步骤:一.创建一个类,去继承Exception / RuntimeException
// 二.在类中创建两个方法: 1.无参构造 2.带String参数的有参构造,调用父类的有参构造方法
//
// 相关例子在 : TestException04 类中


public class TestException04 {
    public static void main(String[] args) {
        System.out.println("beg!");
        try {
            test();
        } catch (MyException e) {
            e.printStackTrace();
        }

    }

    public static void test() throws MyException {
        throw new MyException(); // 抛出自定义异常
    }
}


//创建自己的异常类
class MyException extends Exception{
    public MyException(){

    }
    public MyException(String s){

        super(s);
    }
}

5. 处理异常需要注意的知识:

//1.当打开输入流时候,即new 出输入流类对象后,在使用完后需要将其 关闭,即调用 输入流对象.close()方法将其关闭,不然会耗内存
//2. 用try{} catch(异常类 a){} 处理异常时候,要习惯性在 catch语句块加上 a.printStackTrace() 输出异常错误信息(方便寻找)
//3. 当出现异常时 :查找错误信息,前面 SUN公司写的代码就不用看了,直接看到我们写的代码 ,从第一句看起******

6.额外知识点(b站动力节点老杜的建议)

// 1.如果有多判断条件,其中包括判断是否为null的条件,最好把判断引用是否为null条件,放在第一判断
// 2.判断 引用 == null, 不如 null == 引用
// 3.class 转为 Interface 不需要继承关系

自我总结

看书懂后不能只停留于理论之中,需要用手敲测试程序,进行对知识点的测试,去验证知识点的真实性。毕竟实践是检验真理的唯一标准!
最后希望各位看官 一键三连支 持一下,为我提供更新动力!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值