java基础第七章异常_【Java】第七章 异常处理

【Java】第七章 异常处理

【Java】第七章 异常处理

异常处理

异常体系结构

Error

Exception

编译时异常(checked)

运行时异常(unchecked) RuntimeException

NullPointerException 空指针异常

IndexOutOfBoundsException

ClassCastException

NumberFormatException

InputMismatchException

ArithmeticException

异常处理机制

方式一:try-catch-finally

方式二:throws+异常类型

开发中选择哪种方式

用户自定义异常类

练习

throw 和throws的区别

异常体系结构

java.lang.Throwable 下有java.lang.Error和java.lang.Exception。

f70ee18675785dfc66ffef890cb310a4.png

4ec168a9732294d2e7e5af59f61457e6.png

74eb809a5f70b4dc98f94c0fff61d6aa.png

JAVA虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等严重情况。如StackOverflowError(栈溢出)和OOM(堆溢出)。

一般不编写针对性的代码进行处理。

5eda93f6131af45ed61980cce740ecb1.png

其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。

开发中,由于运行时异常比较常见,所以通常不针对运行时异常编写try-catch-finally。

针对编译时异常,我们一定考虑异常的处理, 因为不处理编译都会报错。

编译时异常(checked)

210572470aecf2eae308c5399c280106.png

运行时异常(unchecked) RuntimeException

NullPointerException 空指针异常

当对象是null,试图用对象去掉方法,对象是空的就会抛空指针异常。一般就是忘了new就直接调。

int[] arr = null;

System.out.println(arr[3]);//空指针异常

String str = null;

System.out.println(str.charAt(0));//空指针异常

IndexOutOfBoundsException

索引越界,可以有数组角标越界、字符串角标越界等等

//ArrayIndexOutOfBoundsException

int[] arr = new int[10];

System.out.println(arr[10]);

//StringOutOfBoundsException

String str = "abc";

System.out.println(str.charAt(3));

ClassCastException

Object obj = new Date();

String str = (String) obj;

NumberFormatException

String str = "abc"

int num = Integer.parseInt(str);

InputMismatchException

输入的和要求的不匹配

Scanner scanner = new Scanner(System.in);

int score = scanner.nextInt();

System.out.println(score);//输入abc就会报错

ArithmeticException

int a = 10;

int b = 0;

System.out.println(a/b);

异常处理机制

小孩放羊,当狼来了(异常来了),小孩可以自己扔石头把狼吓跑(try-catch-finally),或者寻求别人的帮助(throws)

异常的处理:抓抛模型

过程一:“抛”: 程序在正常执行的过程中,一旦出现异常,就会在异常代码出生成一个对应异常类的对象。 并将此对象抛出。一旦抛出对象以后,其后的代码就不再执行。

关于异常对象的产生:

①系统自动生成的异常对象

②手动的生成一个异常对象,并抛出(throw)

throw new RuntimeException("传入的数据类型不匹配")

b1cc98e06c306e425781cf1d47ce899b.png

过程二:“抓”:可以理解为异常的处理方式:①try-catch-finally ②throws

结构:

try{

//可能出现异常的代码

}catch(异常类型1 变量名1){

//处理异常的方式1

}catch(异常类型2 变量名2){

//处理异常的方式2

}catch(异常类型3 变量名3){

//处理异常的方式3

}

...

finally{

//一定会执行的代码

}

使用try将可能出现异常的代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配

一旦try中的异常对象匹配到某一个catch,就进入catch中进行异常处理。处理完成就完成当前try-catch结构。继续执行后面的代码

常用的异常对象处理的方式:

① String getMessage()

②printStackTrace()

finally

是可选的。

finally中声明的是一定会被执行的代码,即使catch中又出现异常了或try中return了 finally的代码还是会被执行。(先执行finally的代码 再 执行catch的return

5e9df8f41e6151a755ac4461a9ede358.png

输出:

b2b184cdf92329f21d36a7e961a036fb.png

像数据库连接、输入输出流、网络编程的socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放。此时资源释放,就需要声明在finally中。

throws的方式只是把问题抛给了方法的调用者,最终还是得用try-catch-finally去解决最终的异常

“throws+异常类型”写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。异常后续的代码不再执行。

2afa89f24cc4081203629e74f3371814.png

执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。建议使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。

如果父类中被重写的方法没有throws,则子类重写的方法也不能使用throws。

用户自定义异常类

如何定义异常类:

继承现有的异常结构:RuntimeException、Exception

提供全局常量:serialVersionUID

提供重载构造器

2b43fa9a97ba80341123607d5e4cf340.png

练习

package com.Exc.day16;

public class EcmDef {

public static void main(String[] args){

//命令行的两个参数

try{

int num1 = Integer.parseInt(args[0]);

int num2 = Integer.parseInt(args[1]);

int res = ecm(num1,num2);

System.out.println(res);

}catch(NumberFormatException e){//数据类型不一致

System.out.println("数据类型不一致");

}catch (ArrayIndexOutOfBoundsException e){

System.out.println("缺少命令行参数");

}catch (ArithmeticException e){

System.out.println("除0");

}catch (EcDef e){

System.out.println(e.getMessage());

}

}

public static int ecm(int num1, int num2){

if(num1<0 || num2<0){

throw new EcDef("分子或分母为负数了!");

}

return num1/num2;

}

}

/**

* 自定义类

*/

class EcDef extends RuntimeException{

static final long serialVersionUID = -703193246939L;

public EcDef(){

}

public EcDef(String msg){

super(msg);

System.out.println("输出的是负数");

}

}

throw是手动生成异常对象,是抛的过程

throws是异常处理的方式 是抓的过程

【Java】第七章 异常处理相关教程

java 封装如何理解

java 封装如何理解 public class NewClass { private String name; public void setName(String n){ name=n; } public String getName(){ return name; }} 所谓封装,顾名思义就是把内容封起来不让查询 那么如何实现封装: 在定义一个类时,将类中的属性私有

深入理解java虚拟机课程的截图-5-宋红康老师

深入理解java虚拟机课程的截图-5-宋红康老师 【来自B站视频:https://www.bilibili.com/video/BV1BJ41177cp?p=154】 //测试不同情况下的GC。结果很妙,可以亲自测试下。public class LocalVarGC { public void localvarGC1() { byte[] buffer = new byte[10 *

java 重载初步定义

java 重载初步定义 public class demo02 { public static void main(String[] args) { int sum= sum(10,20); System.out.println(sum); } public static int sum(int a,int b){ return a+b; }} 这是一个利用重载来进行简单的求和, 首先定义一个sum方法 然后

十、编译器和解释器:V8是如何执行一段JavaScript代码的?

十、编译器和解释器:V8是如何执行一段JavaScript代码的? 目录 编译器和解释器 V8 是如何执行一段 JavaScript 代码的 1. 生成抽象语法树(AST)和执行上下文 2. 生成字节码 3. 执行代码 JavaScript 的性能优化 总结 站在 JavaScript 引擎 V8 的视角,来分析

[Java实战项目]200+行代码构建多功能学生信息管理系统

[Java实战项目]200+行代码构建多功能学生信息管理系统 项目目标: 1. 实现管理员(admin)登录 2. 实现三种学生信息查看方式 查看所有学生信息 根据ID查看学生所有信息 根据ID查看学生姓名 3. 添加学生信息 4. 删除学生信息 5. 实现两种修改学生信息方式 根据ID

图的基本介绍以及Java实现

图的基本介绍以及Java实现 图 一、基本介绍 二、代码实现 一、基本介绍 ??图是一种非线性的数据结构,一般用它来反映数据所对应元素之间的几何关系和拓扑关系。图中包括可以具有零个或者多个相邻元素的节点(顶点),以及两个节点之间的连线——边,共同构成

java基础学习笔记7

java基础学习笔记7 网络 Ip地址 四个字节 每个字节最大到255 提供独一无二的IP地址 TCP 可靠,传输慢 UDP 不可靠,传输慢。QQ聊天 Socket 网络编程也叫Socket编程 端口号 计算机每个进程都有一个或多个端口 TCP Socket模型 代码实现: 半双工聊天: talkserve

Javaweb学习05JavaBean和MVC三层架构

Javaweb学习05JavaBean和MVC三层架构 JavaBean 实体类 必须有一个无參构造 属性必须私有化 必须有对应的set/get方法 一般用来和数据库的字段做映射 ORM(object-relational mapping) ORM: 对象关系映射 表 - 类 字段 - 属性 行记录 - 对象 bodyh1Javabean/h1%-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值