【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。
JAVA虚拟机无法解决的严重问题。如:JVM系统内部错误,资源耗尽等严重情况。如StackOverflowError(栈溢出)和OOM(堆溢出)。
一般不编写针对性的代码进行处理。
其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
开发中,由于运行时异常比较常见,所以通常不针对运行时异常编写try-catch-finally。
针对编译时异常,我们一定考虑异常的处理, 因为不处理编译都会报错。
编译时异常(checked)
运行时异常(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("传入的数据类型不匹配")
过程二:“抓”:可以理解为异常的处理方式:①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
输出:
像数据库连接、输入输出流、网络编程的socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放。此时资源释放,就需要声明在finally中。
throws的方式只是把问题抛给了方法的调用者,最终还是得用try-catch-finally去解决最终的异常
“throws+异常类型”写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。异常后续的代码不再执行。
执行的方法a中,先后又调用了另外的几个方法,这几个方法是递进关系执行的。建议使用throws的方式进行处理。而执行的方法a可以考虑使用try-catch-finally方式进行处理。
如果父类中被重写的方法没有throws,则子类重写的方法也不能使用throws。
用户自定义异常类
如何定义异常类:
继承现有的异常结构:RuntimeException、Exception
提供全局常量:serialVersionUID
提供重载构造器
练习
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%-