• Java入门 面向对象(异常) (第二十二天)


    什么是异常

    Java中:
       异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

    生活中:
       生活中,根据不同的异常进行相应的处理,而不会就此中断我们的生活

    遇到代码发生异常修改代码时的弊端:

    1、代码臃肿 
    2、程序员要花很大精力“堵漏洞”
    3、程序员很难堵住所有“漏洞”

    这时就可以使用异常处理机制

    如何进行异常处理 

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

     

    try-catch块

    使用try-catch块捕获异常,分为三种情况:

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

     异常对象常用的方法

    1)void printStackTrace():输出异常的堆栈信息

    2)String getMessage():返回异常信息描述字符串,是printStackTrace()输出信息的一部分

    e.printStackTrace();

    常见的异常类型

    1)Exception :异常层次结构的父类
    2)ArithmeticException:算术错误情形,如以零作除数
    3)ArrayIndexOutOfBoundsException:数组下标越界
    4)NullPointerException:尝试访问 null 对象成员
    5)ClassNotFoundException:不能加载所需的类
    6)lllegalArgumentException:方法接收到非法参数
    7)ClassCastException:对象强制类型转换出错
    8)NumberFormatException:数字格式转换异常,如把"abc"转换成数字

    存在return的try-catch-finally块

    try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一

    多重catch块  

    引发多种类型的异常:
       ■排列catch 语句的顺序:先子类后父类 
       ■发生异常时按顺序逐个匹配
       ■只执行第一个与异常类型匹配的catch语句

    声明异常

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

    throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
    方式1:调用者处理异常
    方式2:调用者继续声明异常
              main()方法声明的异常由Java虚拟机处理

    抛出异常

    除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
    使用throw抛出异常
    throw与throws 

    throw

    throws

    生成并抛出异常

    声明方法内抛出了异常

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

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

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

    声明抛出异常类型,可以跟多个异常

    异常体系结构 

     

    自定义异常 

    1)当JDK 中的异常类型不能满足程序的需要时,可以自定义异常类
    2)使用自定义异常的步骤

    1、定义异常类
    2、编写构造方法,继承父类的实现
    3、实例化自定义异常对象
    4、使用throw抛出

    (1、定义异常类):继承Throwable类、继承Excepion 或者RuntimeException

     异常链

    A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
             1)抛出原有的异常
                      A方法与B方法进行了关联,不便于代码的修改和扩展
             2)抛出新的异常
                      异常链创建了新的异常但却保留了原有异常的信息

    异常处理原则

    1)异常处理与性能
    2)异常只能用于非正常情况
    3)不要将过于庞大的代码块放在try中
    4)在catch中指定具体的异常类型
    5)需要对捕获的异常做处理

    总结

    1)异常分为Checked异常和运行时异常
          ■Checked异常必须捕获或者声明抛出
          ■运行时异常不要求必须捕获或者声明抛出
    2)try-catch-finally中存在return语句的执行顺序
    3)finally块中语句不执行的情况
    4)throw和throws关键字的区别

    代码:

     例一:

    1. package AnomalyDemo01;
    2. import java.util.Scanner;
    3. public class ExceptionDemo01 {
    4. public static void main(String[] args) {
    5. /*
    6. * 将可能产生异常的代码放入到try语句结构中,可能会有如下三种情况:
    7. * 1)try结构中的代码不会产生异常,那么catch结构的代码就不会执行;
    8. *
    9. * 2)try结构中的代码产生了异常,并且catch结构的代码能够处理这个异常,
    10. * 那么catch处理完异常后,程序继续往下执行
    11. *
    12. * 3)try结构中的代码产生了异常,但是catch结构的代码不能处理这个异常,
    13. * 程序就会被中断
    14. *
    15. */
    16. try {
    17. Scanner in = new Scanner(System.in);
    18. System.out.print("请输入被除数:");
    19. int num1 = in.nextInt();
    20. System.out.print("请输入除数:");
    21. int num2 = in.nextInt();
    22. System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
    23. System.out.println("感谢使用本程序!");
    24. } catch (ArithmeticException e) {
    25. // System.out.println("除数不能为0");
    26. // e.printStackTrace();
    27. }
    28. System.out.println("程序执行完毕");
    29. }
    30. }

     例二:

    1. package AnomalyDemo01;
    2. import java.util.Scanner;
    3. public class ExceptionDemo02 {
    4. public static void main(String[] args) {
    5. /*
    6. * 1)当try结构中的代码产生的异常,catch结构不能处理,依然会中断程序的执行,但是我希望不管产
    7. * 生的异常能不能处理,“程序执行完毕”这行代码都会输出在catch结构后面添加一个finally语句块,
    8. * 不管前面的异常有没有处理,finally语句块中的代码都会执行。
    9. *
    10. * 2)finally语句块中的代码唯一不执行的情况是在前面的try结构或者catch结构中存在退出系统的
    11. * 语句System.exit(1)。
    12. *
    13. */
    14. try {
    15. Scanner in = new Scanner(System.in);
    16. System.out.print("请输入被除数:");
    17. int num1 = in.nextInt();
    18. System.out.print("请输入除数:");
    19. int num2 = in.nextInt();
    20. System.out.println(num1 + "/" + num2 + "=" + num1 / num2);
    21. System.out.println("感谢使用本程序!");
    22. System.exit(1);
    23. } catch (ArithmeticException e) {
    24. System.out.println("除数不能为零");
    25. System.exit(1);
    26. }finally{
    27. System.out.println("程序执行完毕");
    28. }
    29. }
    30. }

     

  • 相关阅读:
    华为OD机考算法题:寻找最大价值的矿堆
    介绍使用Photoshop制作ico图标
    Unity技术手册-脚本初始(下)
    基于微信小程序的订餐系统
    MySQL 数据库存储引擎
    运动控制机器视觉智能制造上位机定制方案
    【高级篇 / ZTNA】(7.0) ❀ 06. 域用户自动安装 FortiClient (下) ❀ FortiGate 防火墙
    Linux搭建samba文件共享服务器,实现基于Linux和Windows的共享文件服务
    简单看懂编译链接
    关于软件交付质量度量标准 这里是一些建议
  • 原文地址:https://blog.csdn.net/m0_70516782/article/details/126283802