Java-异常处理机制-try-catch

在这里插入图片描述


Java-异常处理机制

  • 一、异常概述
    • 1、异常的抛出机制
    • 2、如何对待异常
    • 3、异常的体系结构
      • 3.1、Throwable
      • 3.2、Error和Exception
      • 3.3、编译时异常和运行时异常
      • 3.4、常见的异常有哪些?
  • 二、异常的处理方式一 try-catch的使用
    • 1、过程1:抛
    • 2、过程2:抓
    • 3、使用细节
    • 4、运行时异常案例
    • 5、编译型异常案例
    • 6、开发体会

一、异常概述

在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式问题,读取文件是否存在 ,网络是否始终保持通畅等等。
异常:指的是程序在执行过程中,出现的非正常情况,如果不处理最终会导致JVM的非正常停止。

异常指的并不是语法错误和逻辑错误。语法错了,编译不通过,不会产生字节码文件,根本不能运行。
代码逻辑错误,只是没有得到想要的结果,例如:求a与b的和,你写成了a-b

1、异常的抛出机制

Java中是如何表示不同的异常情况,又是如何让程序员得知,并处理异常的呢?
Java中把不同的异常用不同的类表示,一旦发生某种异常,就创建该异常类型的对象,并且抛出(throw)。然后程序员可以捕获(catch)到这个异常对象,并处理;如果没有捕获(catch)这个异常对象,那么这个异常对象将会导致程序终止。
举例:
运行下面的程序,程序会产生一个数组角标越界异常ArrayIndexOfBoundsException。我们通过图解来解析下异常产生和抛出的过程。

2、如何对待异常

对于程序出现的异常,一般有两种解决方法:一是遇到错误就终止程序的运行。另一种方法是程序员在编写程序时,就充分考虑到各种可能发生的异常和错误,极力预防和避免。实在无法避免的,要编写相应的代码进行异常的检测、以及 异常的处理,保证代码的 健壮性。

3、异常的体系结构

3.1、Throwable

java.lang.Throwable:异常体系的父类
Throwable中的常用方法:

  • public void printStackTrace():打印异常的详细信息。
    包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得使用printStackTrace。
  • public String getMessage():获取发生异常的原因。

3.2、Error和Exception

Throwable可分为两类:Error和Exception。分别对应着java.lang.Errorjava.lang.Exception 两个类。
Error:Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况一般不编写针对性的代码进行处理

  • 例如:StackOverflowError(栈内存溢出)和OutOfMemoryError(堆内存溢出,简称OOM)。

Exception: 其它因编程错误或偶然的外在因素导致的一般性问题需要使用针对性的代码进行处理,使程序继续运行否则一旦发生异常,程序也会挂掉。例如:

  • 空指针访问
  • 试图读取不存在的文件
  • 网络连接中断
  • 数组角标越界

3.3、编译时异常和运行时异常

在这里插入图片描述

  • 编译时期异常(即checked异常、受检异常):在代码编译阶段,编译器就能明确 警示 当前代码 可能发生(不是一定发生) xx异常,并 明确督促 程序员提前编写处理它的代码。如果程序员 没有编写 对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,或者不是靠加简单判断就可以避免的,例如:FileNotFoundException(文件找不到异常)。
  • 运行时期异常(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了xx异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。
    • java.lang.RuntimeException类及它的子类都是运行时异常。比如:ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常。

3.4、常见的异常有哪些?

运行时异常:
ArrayIndexOutOfBoundsException:角标越界
NullPointException:空指针异常
ClassCastException:类型转换异常
NumberFormatException:无法转化异常
InputMismatchException:输入类型异常
ArithmeticException:算术异常

编译型异常
ClassNotFoundException
FileNotFoundException
IOException

二、异常的处理方式一 try-catch的使用

在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时,要检测分母为0,数据为空,输入的不是数据而是字符 等。过多的if-else分支会导致程序的代码加长、臃肿 ,可读性差,程序员需要花很大的精力“ 堵漏洞”。因此采用异常处理机制。

Java异常处理
Java采用的异常处理机制,是将异常处理的程序代码集中在一起 ,与正常的程序代码分开,使得程序简洁、优雅,并易于维护。

Java异常处理的方式:
方式一:try-catch-finally
方式二:throws+异常类型

1、过程1:抛

程序在执行的过程当中,一旦出现异常,就会在出现异常的代码处,生成对应的异常类对象,并将此对象抛出。
一旦抛出此程序不执行其后面的代码。

2、过程2:抓

针对过程1中抛出的对象,进行捕获处理。此捕获处理的过程,就成为抓
一旦将异常进行处理,代码就可以急促执行。

try{...//可能出现的异常代码
}catch(异常类型1 e){...//当产生异常类型1 异常时的处置措施
}catch(异常类型2 e){...//当产生异常类型2 异常时的处置措施
}finally{...//无论是否发生异常,都无条件执行的语句
}
import java.util.InputMismatchException;
import java.util.Scanner;/*** package:PACKAGE_NAME** @Author jimmy-yan* @Create 2024/11/18 17:14*/
public class ExceptionTest {public static void main(String[] args) {ExceptionTest e = new ExceptionTest();e.test();}public void test() {try {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();System.out.println(num);} catch (InputMismatchException e) {System.out.println("出现了InputMismatchException异常");} catch (RuntimeException e) {System.out.println("出现了RuntimeException异常");}System.out.println("异常处理结束,代码继续执行");}
}

3、使用细节

1、将可能出现异常的代码声明在try语句中。一旦代码出现异常,就会自动生成一个对应异常类的对象。并将此对象抛出。
2、针对于try中抛出的异常类的对象,使用之后的catch语句进行匹配,一旦匹配上,就进入catch语句块进行处理。
3、一旦处理结束,代码就可以继续向下执行。
4、如果声明了多个catch结构,不同的异常类型在子父关系的情况下,谁声明在上面,谁声明在下面都可以。如果多个异常类型满足子父类的关系,必须将子类声明在父类结构的上面。否则报错。
5、catch中异常处理的方式:
a、自己编写输出的语句;
b、printStackTrace:打印异常的详细信息;(推荐)
6、try中声明的变量,出了try结构之后,就不可以进行调用了。

4、运行时异常案例

import java.util.InputMismatchException;
import java.util.Scanner;/*** package:PACKAGE_NAME** @Author jimmy-yan* @Create 2024/11/18 17:14*/
public class ExceptionTest {public static void main(String[] args) {ExceptionTest e = new ExceptionTest();e.test1();}public void test1() {try {String str = "123";str = "abc";int i = Integer.parseInt(str);System.out.println(i);}catch (NumberFormatException e){e.printStackTrace();}System.out.println("程序执行结束");}
}

在这里插入图片描述

5、编译型异常案例

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;/*** package:PACKAGE_NAME** @Author jimmy-yan* @Create 2024/11/18 17:14*/
public class ExceptionTest {public static void main(String[] args) {ExceptionTest e = new ExceptionTest();
//        e.test();
//        e.test1();e.test2();}public void test() {try {Scanner scanner = new Scanner(System.in);int num = scanner.nextInt();System.out.println(num);} catch (InputMismatchException e) {System.out.println("出现了InputMismatchException异常");} catch (RuntimeException e) {System.out.println("出现了RuntimeException异常");}System.out.println("异常处理结束,代码继续执行");}public void test1() {try {String str = "123";str = "abc";int i = Integer.parseInt(str);System.out.println(i);} catch (NumberFormatException e) {e.printStackTrace();}System.out.println("程序执行结束");}public void test2() {try {File file = new File("D:\\hello.txt");FileInputStream fis = new FileInputStream(file);  //可能报FileFonudExceptionint data = fis.read(); //可能报IOExceptionwhile (data != -1) {System.out.println((char) data);data = fis.read(); //可能报IOException}fis.close();  //可能报IOException} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

6、开发体会

对于运行时异常:

开发中,通常就不进行显示的处理了,一旦在程序执行中,出现了运行时异常,那么就根据异常的提示信息修改代码即可。

对于编译型异常:

一定要处理,否则代码不能执行通过

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Ubuntu22.04.5上安装Docker-CE

文章目录 1. 查看Ubuntu版本2. 安装Docker-CE2.1 安装必要的系统工具2.2 信任Docker的GPG公钥2.3 写入软件源信息2.4 安装Docker相关组件2.5 安装指定版本Docker-CE2.5.1 查找Docker-CE的版本2.5.2 安装指定版本Docker-CE 3. 启动与使用Docker3.1 启动Docker服务3.2 查看Docker…

【趋势红蓝交易】主图指标操盘技术图文展示,注意要点,通达信炒股软件指标

如上图,主图指标【趋势红蓝交易】,蓝色线下空头趋势,不进场操作或只做超短线的反弹行情。红线之上多头行情,顺势做多,波段和趋势多头操作。 多空操作区间K线变色功能,上涨区间红色K线,叠加紫色趋…

网络协议(TCP/IP模型)

目录 网络初识 网络协议 协议分层 协议拆分 分层 协议分层的优势 1.封装效果 2.解耦合 TCP/IP五层模型 协议之间配合工作(详解) 网络初识 网络核心概念: 局域网:若干电脑连接在一起,通过路由器进行组网。 …

基于图和个性化PageRank的RAG方法HippoRAG

HippoRAG是2024年5月的一篇论文《HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models》(github),它受人脑长期记忆的启发(Hippo是海马体英文单词的前缀),用知识图谱(KG)来存储知识,并用检索编码器和个性化Pag…

【电子设计】WifiESP8266无线通信

硬件 野火STM32开发板 操作系统 FreeRTOS 软件Keil5野火蓝牙模块 ESP8266模块 1. ESP8266 简介 ESP8266 是串口型 WIFI,速度比较低,不能用来传输图像或者视频这些大容量的数据,主要应用于数据量传输比较少的场合,比如温湿度…

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet,这是一个用于医学图像分割的通用框架,它通过切片到体积的传播(Slice-to-Volume propagation)来统一自动(AMIS)和交互式(IMIS)医学图像分割任务。S2VNet利…

单体应用、SOA和微服务架构有什么区别?

大家好,我是锋哥。今天分享关于【单体应用、SOA和微服务架构有什么区别?】面试题。希望对大家有帮助; 单体应用、SOA和微服务架构有什么区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 单体应用(Mono…

实习冲刺第四十天

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 思路详解:本题我们可以设置…

第11篇 计算数据中最长的连续1的个数__ARM C语言<四>

Q:如何设计ARM C语言程序将结果(最长的连续1的个数)显示在7段数码管上? A:基本原理与ARM汇编语言程序类似,也是对HEX并行端口对应内存映射地址进行写操作。如要在HEX0上显示数字0,就点亮除数码…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中,我们简单介绍和使用了GNU Radio软件的基础功能和模块,同时通过GNU Radio Companion(GRC)创建了简单的流程图,展示了信号生成、处理和输出的流程。最后…

用点云信息来进行监督目标检测

🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心…

Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest

AndroidManifest.xml 配置文件中&#xff0c;对 activity 组件进行声明的时候&#xff0c;独立应用在 IDE 显示 intent-filter 报错&#xff0c;但不影响实际编译&#xff0c;因为是系统应用&#xff0c;肯定会有此 URL 的存在。 AOSP 源码&#xff1a; <activity android:…

视频监控汇聚平台:Liveweb安防监控平台实现接入监控视频集中管理方案

随着各行业数字化转型的不断推进&#xff0c;视频监控技术在行业内的安防应用及管理支撑日益增多。然而&#xff0c;由于前期规划不清晰、管理不到位等问题&#xff0c;视频监管系统普遍存在以下问题&#xff1a; 1. 各部门单位在视频平台建设中以所属领域为单位&#xff0c;导…

Java JVM(内存结构,垃圾回收,类加载,内存模型)

一、JVM 主要功能 1. 什么是 jvm&#xff1f; JVM&#xff08;Java Virtual Machine)&#xff1a;负责运行 Java 程序的核心组件。它将 Java 字节码&#xff08;.class 文件&#xff09;解释或编译为机器代码&#xff0c;并提供内存管理、垃圾回收和线程管理等功能。 JRE (J…

基于SpringBoot+Vue的美妆购物网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

实数与复数频谱掩蔽在音频分离中的应用

使用实数和复数频谱掩蔽进行音频分离 频谱掩蔽是指在音频信号的频谱表示中&#xff0c;通过选择性地增强或抑制某些频率成分来改善信号质量或实现信号分离的技术。频谱掩蔽可以分为两种类型&#xff1a;实数掩蔽和复数掩蔽。 实数频谱掩蔽 实数频谱掩蔽主要关注音频信号的幅…

Yagmail邮件发送库:如何用Python实现自动化邮件营销?

目录 一、Yagmail简介 二、安装Yagmail 三、基本使用示例 1. 发送简单文本邮件 2. 发送HTML邮件 3. 发送带有附件的邮件 4. 多收件人处理 5. 自定义邮件头 四、高级功能 1. SMTP配置 2. 邮件模板 3. OAuth2认证 五、自动化邮件营销案例 六、错误处理和调试 七、…

ffmpeg安装及配置简单教程

这是ffmpeg官方网站&#xff1a;https://ffmpeg.org/ 这是ffmpeg提供了其他版本的网站&#xff1a;Builds - CODEX FFMPEG gyan.dev 这是ffmpeg提供了提前编译好的可执行文件的github托管网站&#xff1a; https://github.com/BtbN/FFmpeg-Builds/releases 一般windows版本…

NAT traversal 原理 | TCP / UDP/ P2P

注&#xff1a;本文为 “NAT traversal ”相关的几篇文章合辑。 未整理去重。 NAT 穿越技术原理 Li_yy123 于 2020-12-08 18:54:26 发布 一、NAT 由来 为了解决全球公有 IPv4 的稀缺&#xff0c;提出了 NAT 技术。NAT 是 Network Address Translation 网络地址转换的缩写。 …

mybatis用pagehelper 然后用CountJSqlParser45,发现自己手写的mapper查询效率很慢

如题 效率慢疑惑 效率慢 分页查询,发现效率很慢,然后发现是比较复杂的sql,CountJSqlParser45它不会帮忙优化掉,就是select多少字段它count的时候也还是这么多字段 框架里的用法是这样的 所以去看了CountJSqlParser45里面的代码,发现如果有group之类的,它就不帮忙把count优化…