Java常见异常及处理

Java异常及异常处理


异常是一种特殊的对象,类型为java.lang.Exception或其子类

Java异常处理通过5个关键字来实现:try、catch、finally、throw、throws

  • 捕获异常:

    • try:执行可能产生异常的代码;

    • catch:捕获异常;

    • finally:无论是否发生异常,代码总能执行;

  • 声明异常:

    • throws:声明方法可能要抛出的各种异常;
    • throw:手动抛出异常;

1、try-catch 块捕获异常

1.1 情况1:正常

public void method(){
    try{
        // 代码段(此处不会产生异常) 
    }catch (Expection ex){	//异常对象ex
       // 对异常进行处理的代码段
    }
    // 代码块
}
/* catch 是发生异常时才进入,
当正常时会跳过catch直接执行catch外的代码
*/

1.2 情况2:出现异常

public void method(){
    try{
        // 代码段1
        
        // 代码段2(此处产生异常)
        
        // 代码段3  
    }catch (Expection ex){	//异常对象ex
       // 对异常进行处理的代码段
    }
    // 代码块
}

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

  • try ( 发生异常 )——> 产生异常对象——> 异常类型匹配(进入catch块)——> catch(程序继续执行)——> try-catch块后的代码

1.3 情况3:出现异常,但异常类型不匹配

public void method(){
    try{
        // 代码段1
        
        // 代码段2(此处产生异常)
        
        // 代码段3  
    }catch (Expection ex){	//异常对象ex
       // 对异常进行处理的代码段4
    }
    // 代码块5
}
  • try(发生异常)——> 产生异常对象——> 异常类型不匹配——> (程序中断运行)

总结:

try{
    //
}catch(异常ExceptionException的子类){
   // 
}
1、无异常。执行try-catch后的代码
2、有异常。而且和catch 抓住的异常匹配,执行try--> catch里面的代码且catch后面的代码也会执行
3、有异常。try--> 异常和catch(异常)不匹配,直接在catch这里中断,catch后面的代码页不会执行
  • 当程序出现异常,printStackTrace() 的堆栈跟踪功能显示出程序运行到当前类的执行流程,我们看到==异常堆栈信息==,从下往上看提示内容,找错从上往下找

  • getMessage: 获取异常的字符串提示信息(但并不是所有的异常都有提醒!),是printStackTrace()输出信息的一部分

2、try-catch-finally

在 tyr-catch 块后加入finnally

  • 是否发生异常都会执行;
  • 不执行的唯一情况**:!!!!!**try 块(有异常) ——> catch块(System.exit(1)),中断程序退出jvm,此时finally块不执行

3、存在return的try-catch-finally块

public void method(){
    try{
        // 代码段1
        
        // 代码段2(此处产生异常)
        
    }catch (Expection ex){	//异常对象ex
       // 对异常进行处理的代码段3
        
        return;
        
    }finally{
        
         // 代码块4
    }
}

此时,代码块4会执行吗????

会!!!!

那要是把return 加在try块里,finally会执行吗???

会!!!

问题:

try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序?

要执行,先try-catch块,然后执行finally,再跳到return执行,结束方法。

4、多重catch块

引发多种类型异常时

  • 排列catch 语句顺序:先子类后父类
  • 发生异常时会按顺序逐个匹配
  • 只执行第一个和异常类型匹配的catch语句
try{
     // 代码段
       } catch (IOException exp ){
           System.out.println("捕获IO异常"+exp);
    
       }catch (Exception exp2){// 尽量精确捕捉异常
           // 代码块
       }finally {
           System.out.println("管你捕获到异不异常,我都执行" );
       }

注意:!!try必须要写

try不能单独出现,要么try-catch,要么try-finally,要么就try-catch-finally

5、声明异常

  • 如果在一个方法中抛出了异常,如何通知调用者?

throws 声明某个方法可能抛出的各种异常,多个异常用逗号隔开

  • (我处理不了这个炸弹,你试试~) ——>

    • 方式一: (炸弹到我这里)——> 调用者处理异常

    • 方式二:(啊啊啊,我也处理不了~)——> 调用者继续声明异常

    • 到最后,不解决的话,到main() 方法声明的异常由JVM处理了(害,还得靠我)

发生异常,要么告诉别人(throws)要么处理(throw

  • 抛出指定异常信息:

throw new Except(“我是你指定的异常信息”)

一旦出现throw, 一定要有throws 或者 try-catch处理,要么继续throws!!!


6、throw和throws

  • throw:生成并抛出异常;位于方法体内部;可单独语句使用;抛出异常对象只能是一个

  • throws:声明方法内抛出了异常;必须跟在方法参数列表后面;声明抛出异常可以是多个

7、异常体系结构

7.1 Error

靠程序本身无法恢复的严重错误。

7.2 Exception

由Java应用程序抛出和处理的非常严重的错误。

  • Checked 检查异常——> 编译时就不通过, 一定要处理:要么try-catch要么throws声明

    比如 IoException,ClassNotFoundException 等

  • RuntimeException 运行时异常——> 编译时不报错,运行时异常,不要求一定要处理

    NullPointException,ArithmeticException 等

8、自定义异常

当jdk中的异常类型不能满足所需时可以使用;

8.1 步骤

1、定义异常类——> 继承Throwable类、继承Exception或RuntiomException

2、编写构造方法,继承父类实现(super.)

3、实例化自定义异常对象

4、使用 throw 抛出

9、异常处理原则

异常处理与性能;

异常只能用于非正常情况

不要将过于庞大的代码块放再try中;

在catch中指定具体的异常类型

需要对捕获的异常做处理

1、定义异常类——> 继承Throwable类、继承Exception或RuntiomException

2、编写构造方法,继承父类实现(super.)

3、实例化自定义异常对象

4、使用 throw 抛出

9、异常处理原则

异常处理与性能;

异常只能用于非正常情况

不要将过于庞大的代码块放再try中;

在catch中指定具体的异常类型

需要对捕获的异常做处理

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值