1.概念:

  • 异常 :指的是程序在执行过程中,出现的非正常的情况,终会导致JVM的非正常停止。
  • 在Java等面向对象的编程语言中,异常本身是一个类,

    产生异常就是创建异常对象并抛出了一个异常对象。
  • Java处理异常的方式是中断处理。

    异常指的并不是语法错误,语法错了,编译不通过,不会产生字节码文件,根本不能运行.

2.Throwable体系:

  • 所有异常或错误的超类:java.lang.Throwable ,其下有两个子类:

    java.lang.Error 与 java.lang.Exception

    平常所说的异常指 java.lang.Exception 。
  • 异常与错误的区别

    Error:无法通过处理解决的叫错误,只能事先避免。

    Exception:异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。
  • Throwable中的常用方法:

    public void printStackTrace() :打印异常的详细信息。

    包含了异常的类型,异常的原因,还包括异常出现的位置,

    在开发和调试阶段,都得使用printStackTrace。

    public String getMessage() :获取发生异常的原因。 提示给用户的时候,就提示错误原因。

    public String toString() :获取异常的类型和异常描述信息(不用)。
  • 出现异常,把异常的类名复制到API中查找

3.异常的分类

编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)

运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。(如数学异常)

public class Demo01 {
public static void main(String[] args) {
int[] array = {1,2,3};
/* System.out.println(array[3]);
异常如下:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at Exception.Demo01.main(Demo01.java:30)
其中,java.lang.ArrayIndexOutOfBoundsException表示异常的类型
Index 3 out of bounds for length 3表示异常的原因
at Exception.Demo01.main(Demo01.java:30)表示异常的位置
*/
}
}

4.异常的处理

在java中,提供了一个throw关键字,它用来抛出一个指定的异常对象。那么,抛出一个异常具体如何操作呢?

  1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
  2. 需要将这个异常对象告知给调用者,通过关键字throw完成。throw异常对象。

    throw用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
  • 抛出异常:

    throw new 异常类名(参数)
  • 判断参数合法性,看参数是否为空,统一使用Object类里的静态方法requireNonNull();
public class Demo02 {
public static void main(String[] args) {
int[] array = {1,2,3};
/*
此时index=3越界了,看看运行结果
Exception in thread "main" java.lang.IndexOutOfBoundsException: 小老弟,你给的角标越数组的界了
at Exception.Demo02.getElement(Demo02.java:30)
at Exception.Demo02.main(Demo02.java:23)
*/ int num = getElement(array,3);
System.out.println(num); }
public static int getElement(int[] arr,int index){
if(index < 0||index > arr.length-1){
//此时角标越界了,使用throw抛出异常
throw new ArrayIndexOutOfBoundsException("小老弟,你给的角标越数组的界了");
}
//该方法返回所给角标对应数组元素
int Element = arr[index];
return Element;
}
public static void method(Object obj){
//对传递的obj进行参数的合法性判断
//传给Object的方法requireNonNull
Objects.requireNonNull(obj);
}
}
  • 声明异常关键字throws

    异常处理的第一种方式:交给别人处理

    声明异常:将问题标识出来,报告给调用者。如果方法内通过throw抛出了编译时异常,而没有捕获处理(稍后讲 解该方式),

    那么必须通过throws进行声明,让调用者去处理。

    关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

    声明异常格式:

    修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2…{ }

  • throws用于进行异常类的声明,若该方法可能有多种异常情况产生,那么在throws后面可以写多个异常类,用逗号隔开。

public class Demo03 {
public static void main(String[] args) throws IOException{//此处注意
read("a.txt");
}
public static void read(String path) throws FileNotFoundException, IOException {
if (!path.equals("a.txt")){
throw new FileNotFoundException("文件不存在");
}
if (!path.equals("b.txt")){
throw new IOException("文件不存在");
}
}
}
  • 捕获异常:try...catch

    如果异常出现的话,会立刻终止程序,所以我们得处理异常:

    1. 该方法不处理,而是声明抛出,由该方法的调用者来处理(throws)。
    2. 在方法中使用try-catch的语句块来处理异常。

      try-catch的方式就是捕获异常。
  • 捕获异常:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理。

    捕获异常语法如下:

    try(

    可能存在异常的代码

    )catch(定义一个变量,用来接受try中异常的对象){

    处理异常的代码

    }

    ...

    catch(异常类名 变量名){

    }

    注意:try和catch都不能单独使用,必须连用。try中可能抛出多个异常对象,那么可以使用多个catch处理

  • 如何获取异常的信息:Throwable类中定义了三个查看方法:

    public String getMessage() :返回此throwable的简短描述。

    public String toString() :返回此throwable的详细描述。

    public void printStackTrace() :打印异常对象,默认此方法,打印的异常信息是最全面的。

    包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace();

  • finally代码块:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行 不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

    什么时候的代码必须终执行?

    当我们在try语句块中打开了一些物理资源(磁盘文件/网络连接/数据库连接等),我们都得在使用完之后,终关闭打开 的资源。

  • finally的语法:

    try...catch....finally:自身需要处理异常,最终还得关闭资源。

    注意:

    finally不能单独使用。

    只有try或者catch中调用了退出JVM的方法时finally才不会运行,否则finally永远会执行

public class Demo04_try_catch {
public static void main(String[] args) {
try {
readProblem("a.tx");
} catch (IOException obj) {//try中什么类型异常,括号内就写什么类型
System.out.println("1:"+obj.getMessage());
System.out.println("2:"+obj.toString());
//printStackTrace最全面,默认打印异常对象也是使用该方法
obj.printStackTrace();
System.out.println("3:"+obj);
}finally{//有一些特定的代码无论异常是否发生 论代码是否异常,fanally代码块都会执行
System.out.println("fianlly代码块执行!");
} }
public static void readProblem(String path1) throws IOException {
if (!path1.equals("b.txt")){
throw new IOException("文件后缀名不对");
}
}
}

5.异常注意事项

(一).捕获多个异常如何处理

  1. 多个异常分别处理。
  2. 多个异常一次捕获,多次处理。
  3. 多个异常一次捕获一次处理。一般使用一次捕获多次处理方式

    注意:

    a.多个catch内异常类不能相同,且若有子父类关系,子类需要写在上面

    b.如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。

    c.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出.

    d.运行时异常(runtime)被抛出可以不处理。即不捕获也不声明抛出。

    e.如果finally有return语句,永远返回finally中的结果,即避免在finally中写return语句.
public class Demo05_Tips {
public static void main(String[] args){
try{
int[] arr1 = {1,2,3};
System.out.println(arr1[3]);
//try里多个异常一次捕获
List<Integer> list = List.of(1,2,3);
System.out.println(list.get(3));
} catch(ArrayIndexOutOfBoundsException a){//通过catch括号内参数类型接受对应异常对象
System.out.println(a);
} catch (IndexOutOfBoundsException a){
System.out.println(a);
}
}
public void show0() throws FileNotFoundException{};
public void show1() throws IndexOutOfBoundsException{};
public void show2() throws ArrayIndexOutOfBoundsException{};
public void show3() throws IOException{};
}
class zi extends Demo05_Tips{
//子类重写父类方法时,可以抛出和父类相同的异常
public void show0() throws FileNotFoundException{};
//抛出父类异常类的子类
public void show1() throws ArrayIndexOutOfBoundsException{};
//可以不抛出异常
public void show2() {};
}

定义好异常类后,进行测试:

如果用户注册重复,返回异常信息

6.自定义异常类:

java提供的异常类不够,需要进行自定义异常类:

public class ***Exception extends Exception/RuntimeException{
//添加一个空参数的构造方法
//添加一个带异常信息的构造方法
}

注意:

1.自定义异常类一般以Exception结尾,表示这是异常类

2.自定义异常类必须继承Exception类或者RuntimeException类,

继承Exception类就是编译期异常,选择throws或者try catch

继承RuntimeException就是运行期异常,交给虚拟机处理.

//首先定义一个登陆异常类RegisterException:
//此处继承异常类,本身类名是就是自定义异常类名
public class RegisterException extends Exception{
//模拟注册操作,如果用户名已存在,则抛出异常并提示:亲,该用户名已经被注册。
//原有用户名
//添加一个空参数的构造方法
public RegisterException() {
super();
}
//添加一个带异常信息的构造方法,让父类来处理
public RegisterException(String s){
super(s);
}
}

使用:

public class Demo07_test {

    static String[] username0 = {"1","2","3"};
public static void main(String[] args) throws RegisterException {//声明自定义异常类
System.out.println("请输入用户名");
Scanner sc = new Scanner(System.in);
String str = sc.next();
Check(str);
}
public static void Check(String str) throws RegisterException {//声明自定义异常类
for (String name : username0){
if (name.equals(str)){
throw new RegisterException("该用户名已经被注册");
}
} System.out.println("注册成功。");
}
}

Java自学第7期——异常(Exception)的更多相关文章

  1. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug

    集合:集合是java中提供的一种容器,可以用来存储多个数据. 集合和数组既然都是容器,它们有啥区别呢? 数组的长度是固定的.集合的长度是可变的. 数组中存储的是同一类型的元素,可以存储基本数据类型值. ...

  2. Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)

    1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...

  3. Java自学第8期——多线程

    1.多线程: 操作系统支持同时运行多个任务,一个任务通常是一个程序,所有运行中的程序就是一个进程().程序内部包含多个顺序执行流,每个顺序执行流就是一个线程. 并发:两个或者多个事件在同一个时间段内交 ...

  4. java自学第5期——Object、Date、Calender、System、StringBuilder、基本类型包装类

    一.Object类 作用:对象操作 位置:java.lang.Object 方法: public String toString() :返回对象的字符串表示形式. public boolean equ ...

  5. java自定义抛出的异常Exception

    package com.zhanzhuang.exception; public class CustomizeException { public static void main(String[] ...

  6. java自学第4期——:Scanner类、匿名对象介绍、Random类、ArrayList集合、标准类格式、String类、static静态、Arrays工具类、Math类(1)

    一.Scanner类 1.api简介: 应用程序编程接口 2.Scanner类: 作用:获取键盘输入的数据 位置: java.util.Scanner. 使用:使用成员方法nextInt() 和 ne ...

  7. java自学第3期——继承、多态、接口、抽象类、final关键字、权限修饰符、内部类

    一.继承: 关键字extends /* 定义一个父类:人类 定义父类格式:public class 父类名称{ } 定义子类格式:public class 子类名称 extends 父类名称{ } * ...

  8. Java自学第2期——注释、数据类型、运算符、方法

    2.1.注释 注释用于说明某段代码的作用,某个类的用途,某个方法的功能,参数和返回值数据类型的意义等等: 注释非常非常非常重要,回顾代码时通过注释找回思路:团队沟通需要,让别人读懂你的代码,增加效率: ...

  9. Java自学第9期——Lambda表达式

    1.入门 使用场景:如果创建函数式接口(该接口的抽象方法只能有一个)的实例时,使用Lambda表达式更加简洁方便. 2.格式: (形参列表) -> { 代码块 } 3.简化 只有一个参数时,可以 ...

随机推荐

  1. 删除Kafka中的topic

    删除Kafka中的topic 一.配置delete.topic.enable=true 二.其他方法 一.配置delete.topic.enable=true 修改kafaka配置文件server.p ...

  2. java-poi创建模板

    package com.jy.demo.web; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; i ...

  3. COS数据处理WebP压缩 | 减少70%图像大小

    当前网络中,图片仍是占用流量较大的一部分,在网站的视觉效果和加载速度之间,我们始终面临着两难选择. 一个网站的内容,不仅仅只有文字,图片.动图.视频等众多元素都在帮助用户从我们的网站获取更多的信息,当 ...

  4. httprunner(4)录制生成测试用例

    前言 写用例之前,我们应该熟悉API的详细信息.建议使用抓包工具Charles或AnyProxy进行抓包. har2case 我们先来了解一下另一个项目har2case 他的工作原理就是将当前主流的抓 ...

  5. 搜索Ex (洛谷提高历练地)

    搜索Ex P1120 小木棍 题意:不超过65根长度小于50的小木棍(是由一批等长木棍砍断得到的),求原始木棍的最小可能长度 分析:优化+减枝爆搜 搜索状态要记录当前尝试的已经填好的长度,当前尝试填的 ...

  6. BZOJ1951 古代猪文 【数论全家桶】

    BZOJ1951 古代猪文 题目链接: 题意: 计算\(g^{\sum_{k|n}(^n_k)}\%999911659\) \(n\le 10^9, g\le 10^9\) 题解: 首先,根据扩展欧拉 ...

  7. Windows Server 2016 开启远程连接并延长过期时间

    按照下面文章配置,做完1.2步即可,其中协议号码填写 4954438 亲测有效! Server 2016默认远程桌面连接数是2个用户,如果多余两个用户进行远程桌面连接时,系统就会提示超过连接数,可以通 ...

  8. PowerShell随笔10---Module

    我们总不能把所有脚本文件零散的放着,就像创建一个项目一样,我们创建一个Module. 创建好之后如何让系统认识我们创建的Module呢,我们需要放在指定的位置. 那到底应该放在什么位置呢? 我们可以通 ...

  9. EGADS介绍(二)--时序模型和异常检测模型算法的核心思想

    EDADS系统包含了众多的时序模型和异常检测模型,这些模型的处理会输入很多参数,若仅使用默认的参数,那么时序模型预测的准确率将无法提高,异常检测模型的误报率也无法降低,甚至针对某些时间序列这些模型将无 ...

  10. SpringSecurity简单使用

    什么是SpringSecurity? Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置 ...