• JavaSE - 异常


    目录

                      前言:

    异常分类

    异常处理

    异常抛出

    异常声明

    自定义异常

    小结


    前言:

        异常的出现打破了c语言出现数组越界,空指针异常等问题,程序就直接异常中断。对程序出现异常进行捕获就可以继续执行,不会导致整个程序的崩溃。

    异常分类

     🎈异常分为错误异常两个大类,错误指的时JVM无法解决的严重问题,典型代表StackOverFlowError,OutOfMemoryError,一旦出现程序直接异常终止。异常分为受查异常(编译异常)和非受查异常(运行异常),共同继承于Exception类。

    异常处理

    🪖异常处理分为两种,一种是对可能发生异常的程序进行判断,阻止异常的发生。第二种是发生异常后,对异常进行处理,这里详细分析第二种。

    1. public class Test15 {
    2. public static void main(String[] args) {
    3. try {
    4. int[] arr = {1, 2, 3, 4, 5, 6};
    5. System.out.println(arr[100]);
    6. arr = null;
    7. System.out.println(arr[0]);
    8. System.out.println(10 / 0);
    9. }catch (ArrayIndexOutOfBoundsException e) {
    10. e.printStackTrace();
    11. }catch (ArithmeticException e) {
    12. e.printStackTrace();
    13. }catch (NullPointerException e) {
    14. e.printStackTrace();
    15. }catch (Exception e) {
    16. e.printStackTrace();
    17. }finally {
    18. System.out.println("aaaaa");
    19. }
    20. System.out.println("bbbbb");
    21. }
    22. }

     🤨try中可能发生数组越界,空指针异常,算数异常,程序由上往下执行,当发生数组越界异常后,程序会直接进入catch中进行捕获异常(不会在执行try中后面的代码),然后打印栈上的异常信息。如果没有捕获到异常,程序异常会由main方法交给JVM处理,这时候程序直接异常终止。由于受查异常和非受查异常都是继承于Exception类,所以把Exception放在最后进行捕获,这也是保底的一个做法,但是它不能放在第一个,否则后面的捕获则没有意义。异常一旦捕获程序将继续执行(可以清楚看见bbbbb被打印),否则异常会层层向上传递,如果都没有处理,最终交给JVM处理,程序直接异常中断。finally中的代码一定会被执行(在该方法结束前执行),就算异常没有捕获到也会被执行,一般用来对一些程序的关闭,清理扫尾工作等。

    异常抛出

    🧢上面代码都是程序出现异常后自动抛出,我们也可以手动抛出(throw关键字)。

    1. public class Test15 {
    2. public static void fun(int a) {
    3. try {
    4. if(a == 10) {
    5. throw new NullPointerException();
    6. }
    7. }catch (NullPointerException e) {
    8. e.printStackTrace();
    9. }
    10. }
    11. public static void main(String[] args) {
    12. fun(10);
    13. System.out.println("bbbbb");
    14. }
    15. }

     🎉可以清楚看见手动抛出异常,被捕获后,程序继续执行。异常一旦抛出,就需要被捕获,如果fun中没有捕获到,其后代码将不会执行,在其被调用者main方法中继续捕获,如果还没有捕获到,就交给JVM处理,程序异常终止,抛出的异常最终都是需要处理的,不然就会导致交给JVM处理。

    如果抛出的是运行时异常,不用自己处理。如果抛出编译时异常,就必须自己处理,要不声明异常,要不处理异常,否则程序无法进行编译

    异常声明

    😆利用throws关键字进行声明。

    1. public class Test15 {
    2. public static void fun(int a) throws Exception{
    3. if(a == 10) {
    4. throw new Exception();
    5. }
    6. System.out.println("aa");
    7. }
    8. public static void main(String[] args) {
    9. try {
    10. fun(10);
    11. } catch (Exception e) {
    12. e.printStackTrace();
    13. }
    14. System.out.println("bbbbb");
    15. }
    16. }

    🎄方法中抛出异常后,如果不想处理,利用throws对异常进行声明,调用该方法者必须对异常进行处理,或者继续throws声明。throws可一次声明多个异常,用逗号隔开。如果具有相同的父类,直接声明父类即可。声明异常必须是Exception或者Exception的子类,Exception默认是编译时异常。声明异常并没有对异常处理,最终还需要try catch()进行处理。

    自定义异常类

    1. class UserNameException extends RuntimeException {
    2. public UserNameException() {
    3. super();
    4. }
    5. public UserNameException(String message) {
    6. super(message);
    7. }
    8. }
    9. class PasswordException extends RuntimeException {
    10. public PasswordException() {
    11. super();
    12. }
    13. public PasswordException(String message) {
    14. super(message);
    15. }
    16. }
    17. class Logln {
    18. private String name = "aaaaa";
    19. private String password = "123456";
    20. public void fun(String name, String password) {
    21. try {
    22. if(!this.name.equals(name)) {
    23. throw new UserNameException("用户名错误");
    24. }
    25. if(!this.password.equals(password)) {
    26. throw new PasswordException("密码错误");
    27. }
    28. System.out.println("登录成功");
    29. }catch (UserNameException e) {
    30. e.printStackTrace();
    31. }catch (PasswordException e) {
    32. e.printStackTrace();
    33. }
    34. }
    35. }
    36. public class Test15 {
    37. public static void main(String[] args){
    38. Logln logln = new Logln();
    39. logln.fun("aaaaa","123");
    40. System.out.println("bbbb");
    41. }
    42. }

    😉 可以自定义一个类,去继承Exception类(默认编译时异常),或者继承RuntimeException类(运行时异常)。其中实现无参和有参构造方法。当遇到异常,就可以抛出自己的异常,打印相应的信息。

    小结:

    🐵对可能存在异常的代码进行捕捉,对于整个程序来说,作用是相当大的,防患于未然。

  • 相关阅读:
    Excel 2021|VBA不可不说的注意事项(第一篇)|VBA精准控制选择范围、VBA提高运行速度并降低运行时的内存消耗
    MySql数据是如何存储在磁盘上存储的?
    Web前端开发——新年倒计实时刷新
    最新Justnews主题源码6.0.1开心版+社交问答插件2.3.1+附教程
    算法学习笔记(29):分块
    我的创作纪念日
    小米以“不能胜任工作”为由辞退员工,两次上诉均败诉
    C++面试八股文:什么是左值,什么是右值?
    数字集成电路设计(四、Verilog HDL数字逻辑设计方法)(二)
    【C++Vector容器底层剖析】完成了Vector容器的一些常用函数接口
  • 原文地址:https://blog.csdn.net/weixin_62353436/article/details/126585645