• java的面向对象基础(5)——异常


    嵌入式之路,贵在日常点滴

                                                                    ---阿杰在线送代码

    目录

    一、异常概念 

    什么是异常?

    异常导致的后果?

    如何防止程序中断?

    二、异常的分类 

    三、 Java异常处理机制

    四、throw和throws

    两者区别 

    五、常见异常和自定义异常 

    常见异常

    自定义异常


    一、异常概念 

    什么是异常?

    所谓异常是指在程序运行的过程中发生的一些不正常事件。(如除0溢出,数组下标越界,所要读取的文件不存在)

    异常导致的后果?

    JAVA程序的执行过程中如出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交给Java运行时系统,这个过程称为抛出异常,不处理的话会直接导致程序直接中断。

    如何防止程序中断?

    设计良好的程序应该在程序异常发生时提供处理这些异常的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果。 

    二、异常的分类 

    异常类型包括来源处理

    受查异常

    checked Exception

    Exception及其子类

    (不包括RuntimeException及其子类)

    由代码控制能力之外的因素导致的运行时错误必须要处理,否则通不过编译

    非受查异常

    unchecked Exception

    Error和RuntimeException及其子类RuntimeException一般代表编程错误可以不用处理

    三、 Java异常处理机制

    try-catch-finally

    try:监控区域,执行可能产生异常的代码  (比如读文件、连接网络等等,可能会出现文件没有或者连接不上网络)

    catch:捕获、处理异常

    finally:善后处理,无论是否发生异常,代码总能执行。

    • try{}语句块中放的是检测的java代码,可能会抛出异常,也可能会正常执行。
    • catch(异常类型){} 块是当JAVA运行时系统接收到try块中所抛出异常对象时,会寻找能处理这一异常catch块来进行处理(可以有多个catch块)。
    • finally{}不管系统有没有抛出异常都会去执行,一般用来释放资源。除了在之前执行了System.exit(0)
    1. import java.util.Scanner;
    2. class Person
    3. {
    4. String name;
    5. }
    6. public class Test {
    7. public static void main(String[] args) {
    8. Person p = null;
    9. int a = 10;
    10. int b = 0;
    11. int c = 0;
    12. Scanner sc = new Scanner(System.in);
    13. System.out.println("请输入除数:");
    14. b = sc.nextInt();
    15. try{
    16. c = a/b;
    17. //p.name = "ajie";
    18. }catch(java.lang.NullPointerException e){
    19. System.out.println("空指针,检查下是否没有初始化类");
    20. }catch(java.lang.ArithmeticException e){
    21. System.out.println("你输入了0,请重新输入");
    22. b = sc.nextInt();
    23. c = a/b;
    24. System.out.println("c="+c);
    25. }
    26. //finally{//finally可以不要要,因为这不是固定搭配
    27. // System.out.println("end");
    28. //}
    29. System.out.println("c="+c);
    30. System.out.println("end");
    31. }
    32. }

    运行结果:

    请输入除数:
    0
    你输入了0,请重新输入
    5
    c=2
    end

    异常有很多,那么是不是catch(异常类型) 都需要记住呢,当然不用啦

    1. import java.util.Scanner;
    2. class Person
    3. {
    4. String name;
    5. }
    6. public class Test {
    7. public static void main(String[] args) {
    8. Person p = null;
    9. int a = 10;
    10. int b = 0;
    11. int c = 0;
    12. Scanner sc = new Scanner(System.in);
    13. System.out.println("请输入除数:");
    14. b = sc.nextInt();
    15. try{
    16. c = a/b;
    17. //p.name = "ajie";
    18. }catch(Exception e){
    19. System.out.println("空指针,检查下是否没有初始化类");
    20. System.out.println("你输入了0,请重新输入");
    21. b = sc.nextInt();
    22. c = a/b;
    23. System.out.println("c="+c);
    24. }
    25. //finally{//finally可以不要要,因为这不是固定搭配
    26. // System.out.println("end");
    27. //}
    28. System.out.println("c="+c);
    29. System.out.println("end");
    30. }
    31. }

    运行结果:

    请输入除数:
    0
    空指针,检查下是否没有初始化类
    你输入了0,请重新输入
    5
    c=2
    c=2
    end

    四、throw和throws

    • throw用于手动抛出异常,作为程序员可以在任意位置手动抛出异常。
    • throws用于在方法上标识要暴露的异常。抛出的异常交由调用者处理。

    两者区别 

    • throw用在方法内,后面跟上要抛出的异常类对象。
    • throws修饰在方法上,告诉调用者此方法可能会抛出异常,后面跟上可能要抛出的异常类名。

    throw

    1. class Bar
    2. {
    3. int age;
    4. public Bar(int age){
    5. this.age = age;
    6. }
    7. void check(){
    8. if(age < 18){
    9. throw new IllegalArgumentException("年龄太小");
    10. }
    11. }
    12. }
    13. public class Test {
    14. public static void main(String[] args) {
    15. Bar b = new Bar(15);
    16. try{
    17. b.check();
    18. }catch(IllegalArgumentException e){
    19. System.out.println(e.getMessage());//年龄太小
    20. e.printStackTrace();//抛出异常的数据显示出来java.lang.IllegalArgumen....
    21. }
    22. System.out.println("end");
    23. }
    24. }

    运行结果:

    年龄太小
    java.lang.IllegalArgumentException: 年龄太小
        at Bar.check(Test.java:10)
        at Test.main(Test.java:20)
    end 

    throws 

    1. class Bar
    2. {
    3. int age;
    4. public Bar(int age){
    5. this.age = age;
    6. }
    7. void check()throws IllegalArgumentException{
    8. if(age < 18){
    9. throw new IllegalArgumentException("年龄太小");
    10. }
    11. }
    12. }
    13. public class Test {
    14. public static void main(String[] args) {
    15. Bar b = new Bar(15);
    16. try{
    17. b.check();
    18. }catch(IllegalArgumentException e){
    19. System.out.println(e.getMessage());//年龄太小
    20. e.printStackTrace();//抛出异常的数据显示出来java.lang.IllegalArgumen....
    21. }
    22. System.out.println("end");
    23. }
    24. }

    五、常见异常和自定义异常 

    常见异常

    RuntimeException,IOException,SQLException,ClassNotFoundException

    自定义异常

    JAVA提供的异常体系不可能预见所有希望加以报告的错误

    • 自定义异常类必须从已有的异常类继承。
    • 建立新的异常类型最简单的方法就是让编译器产生默认构造方法。
    • 对异常来说,最重要的部分就是它的类名。
    • 可以为异常类定义一个接受字符串参数的构造方法,字符参数描述异常信息。 
    1. class Bar
    2. {
    3. int age;
    4. public Bar(int age){
    5. this.age = age;
    6. }
    7. void check()throws AgeLessThanEighteenException{
    8. if(age < 18){
    9. throw new AgeLessThanEighteenException("年龄太小");
    10. }
    11. }
    12. }
    13. class AgeLessThanEighteenException extends Exception
    14. {
    15. private String message;
    16. public AgeLessThanEighteenException(String message)
    17. {
    18. this.message = message;
    19. }
    20. }
    21. public class Test {
    22. public static void main(String[] args) {
    23. Bar b = new Bar(15);
    24. try{
    25. b.check();
    26. }catch(AgeLessThanEighteenException e){
    27. System.out.println(e.getMessage());//年龄太小
    28. e.printStackTrace();//抛出异常的数据显示出来java.lang.IllegalArgumen....
    29. }
    30. System.out.println("end");
    31. }
    32. }

    运行结果:

    null
    AgeLessThanEighteenException
        at Bar.check(Test.java:10)
        at Test.main(Test.java:29)
    end 

  • 相关阅读:
    129页4万字某智慧能源集团数字化管控平台项目 建设方案
    220V转18V非隔离降压芯片:满足多种应用需求
    年薪百万的程序员,上网都在看什么?
    【Azure 应用服务】NodeJS Express + MSAL 应用实现AAD集成登录并部署在App Service Linux环境中的实现步骤
    【单片机】新建工程stm大量报错
    c++ 图论学习3
    【鸠占鹊巢】MySQL保留字非法使用,导致数据插入不成功
    蓝牙技术|蓝牙在物联网产品上的功能,特别是苹果Find My中的应用
    DSDS/DSDA/DR-DSDS/DR-DSDA场景介绍和关键Log分析
    Redis的BitMap使用
  • 原文地址:https://blog.csdn.net/weixin_50546241/article/details/126878812