异常详解~

news2024/11/20 8:28:10
  • Java提供的异常机制使程序的变得更加健壮【健壮性】,程序不会那么容易崩溃

 

异常详解

1.异常的基本概念

Java语言中,将程序执行过程中发生的不正常的情况称为异常

注:程序中的语法错误和逻辑错误不是异常

 

2.一个小case快速了解异常

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = 0;
        int n = 0;

        m = sc.nextInt();
        n = sc.nextInt();

        int ret = m / n;//如果n为0程序会怎么样?
        System.out.println(ret);
    }
}

如果n=0的话,可以发现程序会崩溃,崩溃的信息如下:/ by zero【产生了数学运算异常】

 

3.异常事件的分类

  • Error(错误):Java虚拟机无法解决的严重问题。如:StackOverflowError(栈溢出)、OutOfMemory等情况,Error是严重错误,会导致程序崩溃
  • Exception:Java在编译或运行或者运行过程中出现的错误

1)运行时异常:程序运行时发生的异常

2)编译时异常:在代码编写的阶段,编译器检查出的异常

 

4.异常体系图【重点】

1)异常分为两大类:运行时异常和编译时异常

2)运行时异常:编译器检查不出来的异常,对于运行时异常,可以不做处理,因为这类异常很普遍,若全处理后可能对程序的可读性和运行效率产生影响

3)编译时异常:是要求程序员必须进行处理的异常

 

5.常见的运行时异常

1)ArithmeticException —— 数学运算异常

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = 0;
        int n = 0;

        m = sc.nextInt();
        n = sc.nextInt();

        int ret = m / n;//如果n为0程序会怎么样?
        System.out.println(ret);
    }
}

异常结果图:

2)NumberFormatException —— 数字格式不正确的异常

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //思考:若是输入汉字的字符怎么办?
        //会出现数字格式不正确的异常
        String num = sc.next();
        int ret = Integer.parseInt(num);//将字符串转化为整型
        System.out.println(ret);
    }
}

异常结果图:

3)NullPointerException —— 空指针异常

public class Test {
    public static void main(String[] args) {
        String str1 = null;//空指针
        String str2 = "abcdef";
        System.out.println(str1.equals(str2));
    }
}

异常结果图:

4)ArrayIndexOutOfBoundsException —— 数组下标越界异常

public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        for (int i = 0; i <= arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

异常结果图:

5)ClassCastException —— 类型转化异常

public class Test {
    public static void main(String[] args) {
        Father son = new Son();//向上转型
        Grandson grandson = new Grandson();
        grandson = (Grandson) son;
        //正确的向下转型
        Son son1 = (Son) son;//向下转型
    }
}

异常结果图:

 

6.编译时异常

1)概念:编译异常是指在编译期间必须要处理的异常,否则代码不能通过编译

2)常见的编译异常

1> SQLException //操作数据库时,查询表可能发生的异常

2> IOException //操作文件时的异常

3> FileNotFoundException //不存在的文件异常

4> ClassNotFoundException //加载的类不存在的异常

5> EOFException //操作文件到文件末尾,发生异常

6> ILLegalArgumentException //参数异常

 

7.异常处理

1)什么是异常处理?

当异常发生时对程序中异常进行的处理

2)异常处理的方式

1> try - catch - finally

—— 使用try - catch - finally捕获代码中会发生的异常,系统自行处理

2> throws

—— 将要发生的异常抛出,交给调用者去处理,最顶级的处理者就是JVM

3)try - catch - finally处理机制详解

 

4)throws处理机制详解

1> 若一个方法中可能发生异常,但是不确定如何处理这种异常,则可把这种方法显示的声明抛出异常,表妹该方法不对异常进行处理,而有方法的调用者进行处理

2> 在方法声明中用throws遇见可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是该异常的父类

没有显示的处理异常的时候,默认的throws

public class Test {
    public static void main(String[] args) {
        hello();
    }

    private static void hello() {
        f1();
    }

    private static void f1() {
        int m = 10;
        int n = 0;
        System.out.println(m / n);
    }
}

//如何解释以上代码的异常?
//JVM处理了该异常
//1.f1方法中出现的异常,发现f1方法自己没有try -catch - finally,则抛出,方法后面默认有一个throws
//2.f1方法throws后到了hello方法,hello方法也没有try -catch - finally,又抛出给main
//3.main方法中有没有try -catch - finally,则抛出给JVM机处理
//4.JVM机处理的方式很简单:抛出异常信息,然后程序崩溃

 

8.try - catch - finally 和 throws的代码解释

1)一个小case快速了解try - catch - finally

public class Test {
    public static void main(String[] args) {
        //对有异常的代码进行异常处理
        try {
            //1.若是try中没有发生异常,那么catch块中的代码不执行
            int m = 6;
            int n = 0;
            int ret = m / n;
        } catch (Exception e) {
            //2.这里程序员可以设置自己想输出的内容
            System.out.println(e.getMessage());//输出异常信息
            //3.捕获到异常后,会继续执行后续的代码,程序不会被强制退出
        }
        System.out.println("happy~");
    }
}

2)try - catch - finally 细节讨论

        1> 如果异常发生,则异常后面的代码不会执行,直接进行到catch中执行catch的代码

        2> 如果异常没有发生,那么不会进入到catch的代码中

        3> 如果希望异常有没有发生都执行某段代码,那么使用finally无疑是你最好的choice

        4> 若是有多个异常需要捕获,要求父类异常在后,子类异常在前【注:若是发生异常,只会进入一个catch块中进行捕获】

        5> 可以进行try - finally的使用,这种做法没有捕获异常,程序会直接崩溃/退出【为了使用finally中的代码】

public class Test {
    public static void main(String[] args) {
        //对有异常的代码进行异常处理
        try {
            String data = "过去";
            int num = Integer.parseInt(data);
            //1.捕获到异常后,异常的后面代码不会执行
            //2.若是没有捕获到异常,则不会进入catch的代码块中
            System.out.println(data);
        } catch (Exception e) {
            System.out.println(e.getMessage());//输出异常信息
        } finally {
            //3.不管有没有异常必须执行finally中的代码
            System.out.println("执行finally中的代码~");
        }
        //4.异常被捕获则执行后续的代码
        System.out.println("happy~");
    }
}
public class Test {
    public static void main(String[] args) {
        //进行多个异常的捕获:父类异常在后,子类异常在前
        try {
            String res = null;
            String data = "过去";
            System.out.println(res.equals(data));
            int num = Integer.parseInt(data);
            System.out.println(data);
        } catch (NullPointerException e) {
            System.out.println(e.getMessage());//输出异常信息
        } catch (Exception e) {
            System.out.println(e.getMessage());//输出异常信息
        } finally {
            System.out.println("执行finally中的代码~");
        }
        System.out.println("happy~");
    }
}

3)throws细节讨论

        1> 程序中编译异常,程序必须使用try - catch或throws处理

        2> 运行时异常,若程序中没有处理,则默认是以throws的方式进行处理的

        3> 子类重写父类方法的时候,对抛出异常的规定:子类重写的方法,所抛出的异常类型要和父类抛出的异常一致或为父类抛出异常类型的子类型

        4> 在throws过程中,若是有方法使用了try - catch进行了处理,那么就不必使用throws抛出了

public class Test {
    public static void main(String[] args) {
    }
}

class Father {
    public void say() throws RuntimeException {
        int m = 5;
        int n = 0;
        System.out.println(m / n);
    }
}

class Son extends Father {
    @Override
    //该地方的异常类型必须和父类一致或为父类异常类型的子类的
    public void say() throws ArithmeticException {
        super.say();
    }
}

 

9.思考下面会输出什么?

代码1:

public class Test {
    public static void main(String[] args) {
        System.out.println(method());
    }

    private static int method() {
        int i = 1;
        try {
            i++;
            String[] names = new String[3];
            if (names[1].equals("jack")) {
                System.out.println(names[1]);
            } else {
                names[3] = "maria";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            return ++i;
        } finally {
            return ++i;
        }
    }
}

代码2:

public class Test {
    public static void main(String[] args) {
        System.out.println(method());
    }

    private static int method() {
        int i = 1;
        try {
            i++;
            String[] names = new String[3];
            if (names[1].equals("jack")) {
                System.out.println(names[1]);
            } else {
                names[3] = "maria";
            }
            return 1;
        } catch (ArrayIndexOutOfBoundsException e) {
            return 2;
        } catch (NullPointerException e) {
            return ++i;
        } finally {
            ++i;
            System.out.println(i);
        }
    }
}

 

10.如果用户不是输入一个整数,那么一直提示他输入一个整数为止【重点】

public class Test {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String data = "";
        int num = 0;

        while (true) {
            System.out.println("请输入一个整数:");
            data = sc.next();
            try {
                num = Integer.parseInt(data);
                break;
            } catch (Exception e) {
                System.out.print("");
            }
        }
        System.out.println("你输入的值是:" + num);
    }
}

 

11.自定义异常

1)概念

当程序中出现了某些错误,但该错误信息并没有在Throwable的子类中描述处理,这时,我们可以自己设计异常类来描述该异常信息

2)自定义异常类的步骤

1> 定义类:自定义异常类名继承Exception或RuntimeException

2> 如果继承Exception,属于编译异常;继承RuntimeException,属于运行异常【常】

3)一个小case快速了解自定义异常

import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int age = 0;
        age = scanner.nextInt();

        if (age < 0 || age > 120) {
            throw new AgeException("年龄错误");
        }
    }
}

//自定义异常类
class AgeException extends RuntimeException {
    public AgeException(String message) {
        super(message);
    }
}

 

12.throw和throws的区别

关键字

意义

位置

后面紧跟

throws

异常处理的一种方式

方法声明处

异常类型

throw

手动生成异常对象的关键字

方法体中

异常对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1275644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FileInputStream 与 FileOutputStream

IO流&#xff1a;存贮和解决数据的存储方案 以上都是抽象类&#xff0c;不能创建实例 FileOutputStream 操作本地的文件&#xff0c;把文件写入本地磁盘 步骤&#xff1a; 1.创建字节输出流对象 参数是字符串表示的路径或者是File对象都是可以的如果文件不存在会创建一个新的…

ChatGPT探索:提示工程详解—程序员效率提升必备技能【文末送书】

文章目录 一.人工智能-ChatGPT1.1 ChatGPT简介1.2 ChatGPT探索&#xff1a;提示工程详解1.2 提示工程的优势 二.提示工程探索2.1 提示工程实例&#xff1a;2.2 英语学习助手2.3 Active-Prompt思维链&#xff08;CoT&#xff09;方法2.4 提示工程总结 三.文末推荐与福利3.1《Cha…

防孤岛装置在光伏发电、燃气发电等新能源并网供电系统的应用

• AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。 • 当发生孤岛现象时&#xff0c;可以快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全**。 保护功能** ● 三段式过流…

【2024年趋势】推荐5个好用的产品手册制作工具

随着科技的快速发展&#xff0c;人们对于网站产品手册的需求也日益增加。一份详细且易用的产品手册可以帮助用户更好地了解和使用产品&#xff0c;提高用户满意度和忠诚度。之前整理了一期关于2023年我推荐的一些知识库软件&#xff0c;已经12月了&#xff0c;最近我也去关注了…

Ranger安装和使用

Ranger部署 1.准备 1.1 编译 Ranger编译&#xff08;已经编译过的话&#xff0c;直接看1.2&#xff09; 1.1.1 准备到Ranger官网下载ranger的源码&#xff1a;http://ranger.apache.org/download.html 1.1.2 Ranger编译的过程实在非虚拟机环境下完成的&#xff0c;下载好r…

简单了解下IP的全球划分【笔记】

国际互联网号码分配机构 (The Internet Assigned Numbers Authority&#xff0c;简称IANA&#xff09;。它是互联网名称与数字地址分配机构&#xff08;The Internet Corporation for Assigned Names and Numbers&#xff0c;简称ICANN&#xff09;旗下的一个机构&#xff0c;主…

wpf devexpress 使用IDataErrorInfo实现input验证

此处下载源码 当form初始化显示&#xff0c;Register按钮应该启动和没有输入错误应该显示。如果用户点击注册按钮在特定的输入无效数据&#xff0c;form将显示输入错误和禁用的注册按钮。实现逻辑在标准的IDataErrorInfo接口。请查阅IDataErrorInfo接口&#xff08;System.Com…

机器学习(2)回归

0.前提 上一期&#xff0c;我们简单的介绍了一些有关机器学习的内容。学习机器学习的最终目的是为了服务我未来的毕设选择之一——智能小车&#xff0c;所以其实大家完全可以根据自己的需求来学习这门课&#xff0c;我做完另一辆小车后打算花点时间去进行一次徒步行&#xff0…

【ONNX】多个ONNX 模型合并为一个模型

ONNX 模型直接合并&#xff0c;输入和输出不一致也可以&#xff0c;各自输入输出各自的 示例代码 import onnxruntime# version : 1.16.0 import onnxdef log_model(model):model_1_outs {o.name for o in model.graph.output}model_1_ins {i.name for i in model.graph.in…

【Web】NISACTF 2022 个人复现

目录 ①easyssrf ②babyupload ③ level-up ④bingdundun~ 明天就新生赛了&#xff0c;练套题保持下手感吧 &#xff08;文章只选取了一部分&#xff09; ①easyssrf 输入/flag 输入file:///fl4g 访问/ha1x1ux1u.php ?filephp://filter/convert.base64-encode/resource/…

PyQt基础_012_对话框类控件QInputDialog

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class InputdialogDemo(QWidget):def __init__(self, parentNone):super(InputdialogDemo, self).__init__(parent)layout QFormLayout()self.btn1 QPushButton(&qu…

YOLOv8改进 | 2023 | AKConv轻量级架构下的高效检测(可变核卷积)

一、本文介绍 本文给大家带来的改进内容是AKConv&#xff08;可变核卷积&#xff09;是一种创新的卷积神经网络操作&#xff0c;它旨在解决标准卷积操作中的固有缺陷&#xff08;采样形状是固定的&#xff09;&#xff0c;AKConv的核心思想在于它为卷积核提供了任意数量的参数…

Android超简单实现-即时更新Toast(可直接复制)

效果 实现 第一步、封装个工具类ToastUtil.class&#xff08;可直接复制拿走&#xff09; public class ToastUtil {private static Toast mToast null; // toast对象&#xff0c;用于判断是否第一次使用/*** 即时更新Toast* param content content* param message 消息内容…

FLASK博客系列4——再谈路由

最近好像拖更有点久了。抱歉抱歉~ 今天我们继续来聊聊路由&#xff08;其实就是我上次偷懒剩下一点没讲完&#xff09;。 通过上次的文章&#xff0c;我们基本了解了Flask中的路由&#xff0c;是不是比较简单呢&#xff1f;别急&#xff0c;今天来点猛料。 一、路由之HTTP方法绑…

在CentOS系统下的Tomcat8.5或9安装SSL证书

您可以在CentOS系统下的Tomcat服务器安装SSL证书&#xff0c;实现通过HTTPS安全访问Web服务。本文介绍如何CentOS系统下Tomcat 8.5或9安装SSL证书。 环境准备 操作系统&#xff1a;CentOS 7.6 64位 Web服务器&#xff1a;Tomcat 8.5或9 说明 Tomcat服务器需要提前安装JDK环…

C++基础 -25- 动态多态

静态多态在程序编译的时候&#xff0c;确定将要执行的状态。 动态多态在程序运行的时候&#xff0c;才能确定执行的状态。 下面举例实现动态多态 work函数接口通过传参不同做不同的工作 #include "iostream"using namespace std;class person {public:person(){}vi…

10个让UI设计更轻松的工具

UI设计软件对设计师来说非常重要。UI设计工具的使用是否直接影响到最终结果的质量&#xff0c;然后有人会问&#xff1a;UI界面设计使用什么软件&#xff1f;这里有一些UI设计师和那些对UI设计感兴趣的朋友列出了10个易于使用和免费的UI设计软件。 即时设计 即时设计是一款免…

《曾国藩传》:崇尚笨拙的人生哲学

哈喽啊&#xff0c;大家好&#xff0c;我是雷工&#xff01; 以前读书喜欢读小说&#xff0c;喜欢看《我从你的全世界路过》《云间有个小卖铺》这些轻松的小说&#xff0c;读起来很轻松。 随着年龄增长&#xff0c;阅历的增加开始喜欢读历史&#xff0c;读人物传记&#xff0c;…

【涂鸦T2-U】2、添加光感bh1750

文章目录 前言一、基础介绍二、电路图2.1 电路图12.2 电路图2——实际采用 三、代码四、编译五、刷机六、测试结果小结 前言 本章介绍如何在涂鸦T2-U开发板上添加光感bh1750驱动并实现定时读取数据。 一、基础介绍 BH1750( GY-302 )光照传感器 这篇文章有bh1750的基础介绍。…

关于 ls -s 输出文件大小的单位问题的讨论

自己看书正好看到这里&#xff0c;正纳闷呢&#xff0c;上网查了下&#xff0c;发现不是我自己在为这个问题感到困惑。 有个大哥提出一个问题&#xff1a; 问题标题&#xff1a; ls -s的单位到底是什么&#xff1f; man ls -s, --size print the alloca…