java异常

java异常

在程序运行过程中出现的错误,称为异常。

java中异常都是以类的形式存在的。

一、异常的分类

1.1异常的层次结构

20210217195315313.png

1.2异常的层次结构

异常主要分为:错误、一般性异常(受控异常)、运行期异常(非受控异常)

错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应 用程序,最典型的Error 的异常是:OutOfMemoryError.

受控异常:出现了这种异常必须显示的处理,不显示处理 java 程序将无法编译通过

非受控异常:此种异常可以不用显示的处理,例如被 0 除异常,java 没有要求我们一定要处理

1.3 try、catch 和 finally

异常的捕获和处理需要采用 try 和 catch 来处理

try {

}catch(OneException e) { 

}catch(TwoException e) {

}finally {
 
}

try 中包含了可能产生异常的代码

try 后面是 catch,catch 可以有一个或多个,catch 中是需要捕获的异常

​ 当 try 中的代码出现异常时,出现异常下面的代码不会执行,马上会跳转到相应的catch 语句块中,如果没有异常不会跳转到 catch 中

​ finally 表示,不管是出现异常,还是没有出现异常,finally 里的代码都执行,

finally 和 catch可以分开使用,但 finally 必须和 try 一块使用,如下格式使用 finally 也是正确的

try{

}final{

}

1.4 try catch的深入

1)catch后面的小括号中的类型可以是具体的异常类型,也可以是异常类型的父类型

2)catch可以写多个,建议catch的时候,精确一个一个处理,这样有利于程序的调试

3)catch写多个的时候,从上到下,必须遵守从小到大.
4) catch里面可以使用 | 或隔开,在jdk8之前不允许.

二、编译时异常和运行时异常

1)编译时异常和运行时异常,都是发送在运行阶段。编译阶段异常是不会发生的。

2)因为编译时异常必须在编译(编写)阶段预先处理,如果不处理编译器报错,因此得名.

3)所有异常都是发生在运行阶段,因为只有程序运行阶段才可以new对象,异常就是new异常对象.

2.1编译时异常和运行时异常d的区别

​ 编译时异常一般发生的概念较高

​ 运行时异常一般发生的概念较低

2.2特殊的称呼

编译时异常还可以叫做受检异常,还有叫做受控异常

受检异常:CheckException

受控异常

运行阶段异常可以叫做未受检异常,或者非受控异常

未受检异常:UnCheckedException

非受控异常

三、异常的处理方式

第一种:在方法声明的位置上,使用throws关键字

第二种:使用try,catch语句对异常进行捕捉

在方法声明的位置上使用throws关键字,谁调用方法,就抛给谁处理

public class Main {
    public static void main(String[] args) {
        try {
            sj();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static void sj() throws ClassNotFoundException{
        int i = 12/ 0;
        System.out.println(i);
    }

}

四、异常信息的获取

取得异常信息的方法有两种

1)取得异常信息 getMessage()

打印简单的描述信息

try {
    int e = 12/0;
}catch (Exception e){
    System.out.println(e.getMessage());
}
NullPointerException e = new NullPointerException("空指针异常");
String s = e.getMessage();
System.out.println(s); // 空指针异常
  1. 取得异常的堆栈信息(比较适合于程序调试阶段):printStackTrace()

打印异常追踪的堆栈信息

打印异常堆栈信息采用了异步线程的方式.

try {
    int e = 12/0;
}catch (Exception e){
    e.printStackTrace();
}

//java.lang.ArithmeticException: / by zero
//at com.company.Main.main(Main.java:7)

五、上报和捕捉的选择

1)一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给jvm,jvm只有将其终止,所以一般在main方法里面就直接try catch

开发中异常是上报还是捕捉的选择 --> 如果希望调用者来处理就上报

六、finally子句

finally子句代码的最后执行,并且是一定会执行的,即使try语句块的代码出现了异常.

七、final, finally, finalize的区别

final:关键字,表示最终的,不变的。

finally:也是关键字,和try联合使用。

finalize:finalize()是object类中的一个方法。作为方法名出现

使用finlize 是标识符,是jvm的垃圾回收机制调用

八、自定义异常

java自定义异常

​ 两步:

​ 1)编写一个类继承Exception或者RunTimeException.

​ 继承Exception表示的编译时异常,需要在编译阶段进行处理,处理的 方法就是try-catchthrow 异常对象.

​ 2) 提供两个构造方法,一个无参数的,一个带有String参数的.

class yc extends Exception{
    public yc() {
    }

    public yc(String message) {
        super(message);
    }
}
public class Main {
    public static void main(String[] args) {
        // 创建异常对象,没有手动抛出
        yc yc = new yc("用户名不能够为空...");

        //打印异常堆栈信息
        yc.printStackTrace();

        //获取异常的简单描述信息
        String str = yc.getMessage();
        System.out.println(str);
    }
}

自定义异常的常规用法

public class Main {
    public static void main(String[] args) throws yc{
		// 创建对象然后抛出去
        throw new yc("酷酷酷");
    }
}

九、异常与方法覆盖

重写之后的方法不能够比重写之前的方法抛出的异常更加多(更加宽泛),

可以更加少.

class cat{
    public void dosome(){

    }
}

class c extends cat{
    public void dosome() throws Exception{ // 报错
		// 如果是RuntimeException运行时异常可以继承,不会报错
    }
}

十、总结异常中的关键字

try
catch
finally


throws 在方法声明的位置使用,表示上报异常信息给调用者
throw  手动抛出异常!


lic void dosome(){

    }
}

class c extends cat{
    public void dosome() throws Exception{ // 报错
		// 如果是RuntimeException运行时异常可以继承,不会报错
    }
}

十、总结异常中的关键字

try
catch
finally


throws 在方法声明的位置使用,表示上报异常信息给调用者
throw  手动抛出异常!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值