异常类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)

一、前言

作者是一位自学JAVA的小白,通过网上视频(动力节点)学习和自己对JAVA核心思想一书的理解,现将自己对异常的认知描述如下:(希望能与各位同行好友共同分享自己所学的java知识,同时,也热切期望各位同行前辈能够帮助作者指出不足,让小白的编程技术能更上一层楼,感谢各位同行大佬。

二、异常与错误的基本理解

2.1 异常与错误的定义

异常: 程序执行过程中发生了不正常的情况。

异常(exceptional condition)是指阻止当前方法或作用域继续执行的问题。-----JAVA核心思想

小白理解:在程序中可以避免或者解决的错误。

错误:运行不了的代码语句或规范。

所有的错误只要发生,Java就会终止程序的执行,退出JVM,错误不能运行。

2.2 异常分类

异常可以分为:编译时异常(Exception)和运行时异常(RunTimeException)

编译时异常:所有的Exception的直接子类,必须在编写程序的时候预先对这种异常进行处理,如不处理,编译器报错。

运行时异常:所有的RuntimeException及子类都属于运行时异常,运行时异常在编写程序阶段,可以不处理。

编译时异常大概率会发生,运行时异常发生概率相对较小。

此处插图

需要注意的是,编译时异常和运行时异常,都是发生在运行阶段,因为只有程序运行阶段才可以new对象,异常的发生就是new异常对象,编译时异常必须在编写阶段预先处理,如果不处理,编译器报错。

2.3 异常的别名

编译时异常又称为受控异常、受检异常

运行时异常又称为不受控异常、未受检异常

三、异常的处理

异常在Java中可以看做是一种类(JAVA宗旨:一切皆可对象,要啥new啥------JAVA核心思想)

3.1 异常处理的两种方式

                    1、使用throw,throws关键字(Java中自带的异常),抛给上一级。

                   2、使用try catch语句捕获异常

JAVA为了鼓励人们将可能会抛出的异常告知使用此方法的前端程序员,提供了一种异常声明的机制,它属于方法声明的一部分。

异常说明(throws)

//throws声明只能抛出发生JAVA自带的异常类
public static void main(String []args) throws 

throw(抛出)

//用于程序员自己产生抛出新建的异常类
throw new //新建的异常类

3.2 异常方法

          getMessage();

          作用:输出简述异常信息

Exception e=new Exception("异常错误");
System.out.println(e.Message);

输出

异常错误

          exception.printStackTrace();

          作用:打印异常追踪的堆栈信息,类似debug

输出

    //输出形式
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
	at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
	at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
	at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)

需注意的是,Java后台打印异常堆栈追踪信息的时候,采用了异步线程的方法打印,从上往下一条条看。

3.3 异常的使用

自动抛出

小白理解:只有在main()方法throws Java自带的异常类或者在最初调用异常语句的方法上声明Java自带的异常类,才能向上自动抛出,在其余方法使用throws只能声明发生的异常,用于提醒客户端程序员。

//抛出声明
public static void main(String []agrs) throws NullPointException{ }
public static void dosome()throws ClassNotFoundException{}

用例:

public class ExceptionTest04 {

    private static void m1()throws FileNotFoundException{
        m2();
    }
    private  static void  m2()throws  FileNotFoundException{
        m3();
    }
    private static void m3()throws FileNotFoundException {

        new FileInputStream("abcdsesf");//new FileNotFoundException 对象
    }

    public static void main(String[] args) {

        try {
             m1();
            /**
             * 调用m1,m2,m3方法,在试图捕捉异常后,如果捕捉到了,就不再继续执行该方法后面的语句,转而执行catch和finally
             */
            System.out.println("end");
        }
        catch (FileNotFoundException e) {
        //e引用保存的内存地址是new出来异常对象的内存地址
           String ep=e.getMessage();//以字符串形式获取简述异常信息
            //System.out.println(ep);//输出简单异常信息
            e.printStackTrace();//该方法与debug相似的功能,输出较详细的异常语句路径
            System.out.println("begin");
        }
        finally {
            /**
             * 在这里设置文件流的关闭---老猿经验
             * finally内的代码一定会执行
             */
              }
        System.out.println("perfect");//try catch后继续执行

注意:
     向上依次抛时,只能是抛向他的父类对象。
     只要异常没有捕捉,采用上抛的方式,发生异常后,异常语句后面就没有执行。
     反之,只要try catch捕捉,当JAVA执行到try中的异常语句时,如发生异常后,停止执
     行异常后续代码,转而执行catch语句,try catch的下面代码就能继续执行。
     异常处理机制的作用是增强程序的健壮性
结果:

java.io.FileNotFoundException: abcdsesf (系统找不到指定的文件。)
	at java.io.FileInputStream.open0(Native Method)
	at java.io.FileInputStream.open(FileInputStream.java:195)
	at java.io.FileInputStream.<init>(FileInputStream.java:138)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
	at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
	at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
	at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
begin
perfect

手动抛出

throw 异常对象;
//throw new Exception;

注意:Java中异常发生后如果一直采用抛出的形式,最终抛给到main()方法,main()方法继续向上抛,最终可能导致JVM终止程序运行
捕获

try{
     //可能发生异常的语句
   }catch(Exception e){  
    //e是一个引用变量,指向堆中的Exception
       }   
finally{

}

注意:try中包含的是可能发生异常的语句,catch能有多个,但必须按照树状结构,由底向上,由具体的异常到父类异常捕获,当异常发生时,异常下面的语句不会执行,转而执行catch和finally语句(如果有的话)。

3.4 throws和throw的区别

1、作用不同

     throw用于程序员自行产生并抛出异常, throws用于声明在该方法内抛出了异常

2、使用的位置不同

     throw位于方法体内部,可以作为单独语句使用

     throws必须跟在方法参数列表的后面,不能单独使用

3、内容不同

    throw抛出一个异常对象,且只能是一个

    throws后面跟异常类,而且可以有多个。

四、final finally finalize三者之间的区别

final:是一种关键字,被final修饰的类,方法,变量,类不可被继承,方法不能被重写,变量值不能被修改,final在修饰变量时通常与static连用。

finally:是一种关键字,出现在异常中,finally通常与try连用,在try内没有System.exit()语句的情况下,finally内的方法一定会被执行。

finalize:是一种标识符,是GC负责清理垃圾回收时的一种方法。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿江小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值