Java程序运行的问题——异常

什么是异常?

Java程序在运行时出现的问题就叫异常

jdk中将异常一新封装成了一个个的类,当出现问题时,就会创建异常对象,抛出异常信息(问题原因、位置)

1.异常

1.1异常的继承体系

Throwable 是所有错误(error)和异常(Exception)的父类

错误(error)是程序运行过程中出现的严重问题(内存不够),只能修改代码避免这种错误

Exception 是Throwable 的子类,用来表示java程序中可能出现的异常,并要求对异常进行合理的处理

RuntimeException 和CheckedExceptions 两个是Exception的子类

RuntimeException及其子类 (运行时异常) java运行过程中出现的异常

CheckedExceptions 编译时异常

1.2异常和错误的区别

异常:是指程序在编译、运行期间发生了某种异常,可以对异常进行具体的处理,如果不处理异常,程序会结束

错误:是指程序运行时发生了某种错误,Error错误通常没有具体的处理方法,一般情况下错误都发生在JVM,我们无法处理

错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到

1.3 异常处理

1.jvm默认处理方式

一旦发生异常,产生异常代码的下面的代码就不再执行

public class Test {public static void main(String[] args) { 
//        5.jvm 接收到异常后,按默认处理方法处理
//        int[] arr=new int[1000*1000*1024];
//        System.out.println(arr[0]);int [] arr=new int[3];int j=method(arr); //3.main方法接收到方法跑过来的异常对象//4.jvm 当前main方法有没有处理这个异常的代码,//如果没有,继续抛给main方法的调用者,这里指的是jvmSystem.out.println(j);}public static int method(int[] arr){int i=arr[3];   //1.当程序运行到arr[3]时,jvm检查有没有索引3,// 没有jvm会自动抛出一个异常.ArrayIndexOutOfBoundsException//2.检查method方法有没有处理这个异常的代码,// 没有找到,继续把这个异常抛给method的调用者return i;}
}
```

1.4编译时异常和运行时异常

  ⑴运行时异常:RuntimeException及其子类

​                                IndexOutOfBoundsException

​                               NullPointerException  空指针异常

​                               ClassCastException   类型转换异常

运行时异常程序员可以不去处理,当异常出现时,虚拟机会处理

⑵编译时异常:非RuntimeException及其子类的异常。就在编译阶段会出现的异常

​    ClassNotFoundException

​    FileNotFoundException

编译时异常又叫做检查性异常,如果我们不处理,程序是不能被编译通过的,在idea中也会出现一条红线。因此编译时异常程序员必须处理

1.5 处理异常

捕获:java对异常有针对性额语句进行捕获,对出现的异常进行指定方式处理

格式:

try{

  //可能出现异常的代码

}catch(异常类 变量){

 //遗产处理语句

}

int i=10;
int j=0;
int [] arr=null;
try {j=arr[3];int s = i / j;
}catch (ArithmeticException e){System.out.println("算术异常");e.printStackTrace();
}catch (NullPointerException e){System.out.println("空指针异常");
}catch (Exception e){System.out.println("异常");}

多个catch的异常不能相同,如果异常存在子类父类关系,子类在上面,父类在下面

1.5.1 finally代码块

无论try是否发生异常,finally语句一定会执行

格式:

try{

  //可能出现异常的代码

}catch(异常类 变量){

 //遗产处理语句

}finally{

  //无论try是否发生异常,finally语句一定会执行

一般finally里面里释放资源(io,数据库连接)的代码块

}

1.6 抛出异常 throw

 在java中,提供这个throw关键字,用力抛出一个指定的异常对象。

1.创建一个异常对象

2.将这个异常对象告诉调用者:throw 异常对象

public static void main(String[] args) { //5.jvm 接收到异常后,按默认处理方法处理
//        int[] arr=new int[1000*1000*1024];
//        System.out.println(arr[0]);//int [] arr=new int[3];int[] arr=null;int j=method(arr,3); //3.main方法接收到方法跑过来的异常对象//4.jvm 当前main方法有没有处理这个异常的代码,//如果没有,继续抛给main方法的调用者,这里指的是jvmSystem.out.println(j);}public static int method(int[] arr,int i){if(arr==null){throw  new NullPointerException();}if(i>=arr.length){//           return -1;throw new ArrayIndexOutOfBoundsException();}if(i<0){throw new ArrayIndexOutOfBoundsException();}int j=arr[i];   //1.当程序运行到arr[3]时,jvm检查有没有索引3,// 没有jvm会自动抛出一个异常.ArrayIndexOutOfBoundsException//2.检查method方法有没有处理这个异常的代码,// 没有找到,继续把这个异常抛给method的调用者return j;}

 

1.7 声明异常 throws

public static int method(int[] arr,int i) throws NullPointerException,ArrayIndexOutOfBoundsException

如果在方法内部抛出编译时异常,没有捕获,方法上必须使用throws 声明,让调用者处理

1.8 异常常见方法

printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程

/*** Returns the detail message string of this throwable.* @return  the detail message string of this {@code Throwable} instance*          (which may be {@code null}).*/public String getMessage() {return detailMessage;}//返回该异常的详细信息public void printStackTrace() {printStackTrace(System.err);}//在控制台输出该异常的的名字和信息、以及出现的位置

06e8b45d481d4859a12b3f7c5879fe6c.jpeg

2.自定义异常

自定义的异常用法通常包含四步:

1.定义异常类
2.写继承关系
3.空参构造
4.代参构造

如下:我自定义了一个异常类NameFormatException,用来在用户年龄错误时抛出

public class NameFormatException extends RuntimeException{public NameFormatException() {}public NameFormatException(String cause) {super(cause);}
}public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {//判断年龄是否符合if(name.length()<3&&name.length()>10){throw new NameFormatException(name+"ss");}this.name = name;}public int getAge() {return age;}public void setAge(int age) {if(age<18&&age>30){throw new RuntimeException();}this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注:文章来自闫军锋老师课堂笔记扩充修改

 

 

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

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

相关文章

Python控制浏览器——selenium模块

Python控制浏览器——selenium模块 目录 Python控制浏览器——selenium模块准备工作【1】安装selenium【2】安装浏览器驱动【3】测试驱动&#xff08;作者是Edge&#xff09; 导航和操作窗口导航返回前进刷新最大化窗口切换选项卡 查找和操作元素8种基本By定位方式[1]ID[2]Name…

关系(二)利用python绘制热图

关系&#xff08;二&#xff09;利用python绘制热图 热图 &#xff08;Heatmap&#xff09;简介 热图适用于显示多个变量之间的差异&#xff0c;通过颜色判断彼此之间是否存在相关性。 快速绘制 基于seaborn import seaborn as sns import pandas as pd import numpy as np i…

一个 hipsolver 特征值示例

1&#xff0c;原理 通过雅可比旋转&#xff0c;对对称矩阵计算特征值和特征向量&#xff1b; 通过初等正交变换&#xff0c;每次把其中一个非主对角元素消成零&#xff0c;最终只剩主对角线非零元素为特征值&#xff0c;同时把初等变换累积下来&#xff0c;构成特征向量。 2&a…

CAS(Compare And Swap)

目录 CAS概念 乐观锁与悲观锁 ABA问题 Unsafe类 ​编辑 原子类 基本类型原子类 原子引用类 原子数组 原子更新器类 原子累加器 CAS概念 CAS是Compare And Swap的缩写&#xff0c;中文翻译成&#xff1a;比较并交换&#xff0c;实现无锁并发时常用到的一种技术。它一…

element plus的el-image图片发布到nginx不显示

问题&#xff1a; <el-image alt""src"/img/month-b.png" class"card-icon"style"width: 89px;height: 89px;right: -7px;top: -5px;"/> 部署到nginx二级路由访问地址是&#xff1a; http://192.168.1.207/divided/# 这时候使用…

总结jvm中GC机制(垃圾回收)

前言 本篇博客博主将介绍jvm中的GC机制&#xff0c;坐好板凳发车啦~~ 一.GC相关 1.1回收栈内存 对于虚拟机栈&#xff0c;本地方法栈这部分区域而言&#xff0c;其生命周期与相关线程相关&#xff0c;随线程而生&#xff0c;随线程而灭。并且这三个区域的内存分配与回收具有…

OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序

ADC&#xff08;Analog to Digital Converter&#xff09;&#xff0c;即模拟-数字转换器&#xff0c;可将模拟信号转换成对应的数字信号&#xff0c;便于存储与计算等操作。除电源线和地线之外&#xff0c;ADC只需要1根线与被测量的设备进行连接。 一、案例简介 该程序是基于…

github本地仓库push到远程仓库

1.从远程仓库clone到本地 2.生成SSH秘钥&#xff0c;为push做准备 在Ubuntu命令行输入一下内容 [rootlocalhost ~]# ssh-keygen -t rsa < 建立密钥对&#xff0c;-t代表类型&#xff0c;有RSA和DSA两种 Generating public/private rsa key pair. Enter file in whi…

Synchronized锁升级过程

无锁-->偏向锁---> 轻量级锁---->重量级锁 ①、从无锁到偏向锁&#xff1a; 当一个线程首次访问同步块时&#xff0c;如果此对象无锁状态且偏向锁未被禁用&#xff0c;JVM 会将该对象头的锁标记改为偏向锁状态&#xff0c;并记录下当前线程的 ID。此时&#xff0c;对…

Java进阶-反射的详解与应用

本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力&#xff0c;包括在运行时动态获取类信息、操作对象字段和方法的能力。随后&#xff0c;通过具体代码示例&#xff0c;展示了如何利用反射进行字段访问、方法…

3.5网安学习第三阶段第五周回顾(个人学习记录使用)

本周重点 ①SSRF服务器端请求伪造 ②序列化和反序列化 ③Vaudit代码审计 本周主要内容 ①SSRF服务器端请求伪造 一、概述 SSRF: server site request forgery (服务器端请求伪造)。 SSR: 服务端请求&#xff0c;A服务器通过函数向B服务器发送请求。 SSRF发生的前提条件…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

高精度算法(加、减、乘、除,使用c++实现)

一、概念 在我们进行计算的过程中&#xff0c;经常会遇到几十位&#xff0c;甚至几百位的数字的计算问题&#xff0c;也有可能会遇到小数点后几十位&#xff0c;几百位的情况&#xff0c;而我们面对这样的情况下&#xff0c; 和 的数据范围显然是不够使用的了。因此这时&am…

Node.js-知识点学习总结归纳

Node.js-知识点学习总结归纳 安装nodenode运行方式通过Node.js直接运行js文件&#xff08;也就不用通过网页html了&#xff09;绝对路径调用:相对路径调用&#xff1a;直接运行js命令&#xff1a; Vscode控制台使用node运行js文件 安装node 这个就不用讲了吧&#xff0c;网上搜…

开源知识库平台Raneto--使用Docker部署Raneto

文章目录 一、Raneto介绍1.1 Raneto简介1.2 知识库介绍 二、阿里云环境2.1 环境规划2.2 部署介绍 三、环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Raneto镜像五、部署Raneto知识库平台5.1 创建挂载目录5.2 编辑config.js文件5.3 编…

Sui Basecamp日程公布,两天超50场密集分享等你来参加

随着4月的来临&#xff0c;我们也怀着激动的心情迎来了Sui全球旗舰品牌会议Sui Basecamp的个位数倒计时。 Sui Basecamp将在4月10–11日巴黎区块链周期间举行&#xff0c;Web3构建者、知名企业和信仰者齐聚一堂&#xff0c;在这里共同创造、学习和建立联系。Basecamp将由具有对…

左值与右值,以及c++11的相关特性。

目录 左值 右值 左值引用总结&#xff1a; 右值引用总结&#xff1a; 右值引用使用场景和意义&#xff1a; 1、左值引用的使用场景&#xff1a; 编译器优化1&#xff1a; 2、移动构造与移动赋值&#xff1a; 3、右值引用的使用场景&#xff1a; 编译器优化2&#xff1a…

excel匹配替换脱敏身份证等数据

假如excel sheet1中有脱敏的身份证号码和姓名&#xff0c;如&#xff1a; sheet2中有未脱敏的数据数据 做法如下&#xff1a; 1、在sheet2的C列用公式 LEFT(A2,6)&REPT("*",8)&RIGHT(A2,4) 做出脱敏数据&#xff0c;用来与sheet1的脱敏数据匹配 2、在sheet…

【卫星家族】 | 高分六号卫星影像及获取

1. 卫星简介 高分六号卫星&#xff08;GF-6&#xff09;于2018年6月2日在酒泉卫星发射中心成功发射&#xff0c;是高分专项中的一颗低轨光学遥感卫星&#xff0c;也是我国首颗精准农业观测的高分卫星&#xff0c;具有高分辨率、宽覆盖、高质量成像、高效能成像、国产化率高等特…

Mysql数据库:故障分析与配置优化

目录 前言 一、Mysql逻辑架构图 二、Mysql单实例常见故障 1、无法通过套接字连接到本地MySQL服务器 2、用户rootlocalhost访问被拒绝 3、远程连接数据库时连接很慢 4、无法打开以MYI结尾的索引文件 5、超出最大连接错误数量限制 6、连接过多 7、配置文件/etc/my.cnf权…