Java异常处理

导读

在日常的生活中,生活不是如我们所想的一帆风顺,也会遇到各种事情而不顺心,如汽车开到半截没油了、

想玩电脑停电等等,这些例子有很多,但我们都不会驻留此处,人生本身就可以说是一个程序,都是为了

得到结果而努力,同样程序运行也会出现非正常的现象,有除数为0、文件不存在,文件不能打开、网络

连接中断,内存不够用等,这些非正常现象被称为运行错误,根据错误性质可以将运行错误分为两类:

致命性错误***和***非致命性的异常

致命性错误

例如:程序进入了死循环或者递归无法结束或内存溢出,这些是运行错误是致命性的(专业术语:“错误”)。

解决的方法:只能在编程阶段解决,运行这个程序本身无法解决,只能依靠其他程序干预,否则一直会处于

非正常状态。

非致命性异常

如运算时除数为0,或操作超出数据范围,或打开一个文件时发现文件并不存在,或欲装入的类文件丢失,

或网络连接中断等,这现象称为非致命性异常(简述:异常)。

**解决方法:**通过在源程序中,加入异常处理代码,当程序运行中出现异常时,有异常处理代码调整程序运行方向

加入异常处理代码,当程序运行中出现异常时,由异常处理代码调整程序运行方向,使程序仍可继续运行直至

正常结束。

异常是可以检测和处理的,所以产生了相应的异常处理机制。

目前大多数面向对象语言都提供异常处理机制,而错误处理一般由系统承担,语言本身不提供错误处理机制。

概念

Java中的异常处理是以面向对象为基础的一种运行态错误处理机制,通过对异常信息的封装实现对用户非法操作、参数设置异常、硬件系统异常,运行时网络状态更换等在运行态中可能出现的异常信息的处理机制。

异常处理的类层次

Java通过错误类(Error)和异常类(Exception)来处理错误和异常,他们都是Throwable类的子类,Throwable

类的继承体系

错误类(Error):java虚拟机无法解决的严重问题。如:jvm系统内部错误、资源耗尽等严重情况。

异常类(Exception):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性代码进行处理。

例如空指针访问,试图读取不存在的文件,网络连接中断,Exception分为两大类:运行时异常[]和编译时异常[].

**注意:**对于运行时异常,可以不作处理。因为这类很普通,全处理会对程序的可读性和运行效率产生影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISvXhIxr-1631688511943)(images\异常处理层次.jpg)]

在这里插入图片描述

常见的运行时异常
  1. NullPointerException 空指针异常 2.ArithmeticException 数学运算异常

    3.ArrayIndexOutOfBoundException 数组下标越界异常

    4.ClassCastException 类型转换异常 5.NumberFormatException 数字格式不正确异常[]

练习
try {
    Cat cat = new Cat();
    cat = null;
    System.out.println(cat.name);
}catch (Exception d){
    System.out.println("异常问题:"+d.fillInStackTrace());
}//空指针异常
try {
    String friends[] = {"tom","jack","malin"};
    for (int i = 0;i<4;i++){
        System.out.println(friends[i]);
    }
}catch (Exception a){
    System.out.println("输出异常原因"+a.fillInStackTrace());
    //数组溢出
}
try {
    int y;
    LianXi3 a = new LianXi3();
    y = 3/a.x;
}catch (Exception f){
    System.out.println("输出异常原因"+f.fillInStackTrace());
}
  System.out.println("program ends ok");
//算数异常
异常处理方法

基本介绍

异常处理就是当异常发生时,对异常处理的方式

异常处理的方式

1.try-catch - finally

程序员在代码中捕获发生的异常,自行处理

2.throws

将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是jvm

多个catch块

一个catch只能处理一类异常,当try块中的语句组可能抛出多种异常时,就需要有多个

catch块来分别处理各种异常。

try{
	int a= args.length;
	System.out.println("a="+a);
	int b= 42/a; int c[] ={1}; c[42] = 99;
}catch(ArithmeticException e){
	System.out.println("div by 0:"+e);
}catch(ArrayIndexOutOfBoundsException e){
	System.out.println("array index oob:"+e);
}

一个异常对象能否被一个catch块接收主要看该异常对象与catch块中声明的异常类的匹配情况,

当他们满足下面条件中的任一条时,异常对象被将被接受

​ 异常对象是catch块中声明的异常类的实例;

​ 异常对象是catch块中声明的异常类的子类的实例;

​ 异常对象实现了catch块中声明的异常类接口。

当使用多个catch块时,需注意catch子句排列顺序—先特殊到一般,也就是子类在父类前面。如果在父类后面,子类将永远不会到达。

try语句嵌套

一个try语句可以在另一个try块内部----try语句的嵌套。

每次进入try语句,异常的前后关系都会被压入堆栈。如果一个内部的try语句不包含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。

这个过程将继续知道catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。

如果没有catch语句匹配,Java的运行时系统将处理这个异常。

finally语句块

某些情况下,不管异常是否发生,都需要处理某些语句,那么放到finally语块中。finally语句所包含的代码在任何

情况下都会被执行。

一个try语句至少有一个catch语句或finally语句与之匹配,但匹配的catch可以多个,而finally只有一个,并且

finally不是必须有的。

自定义异常
自定义异常的步骤

1.定义类:自定义异常类名(程序员自己写)继承Exception或RuntimeException

2.如果继承Exception,属于编译正常

3.如果继承RuntimeException,属于运行异常(一般来说,继承RuntimeException)

throw和throws的区别
意义位置后面跟的东西
throws异常处理的一种方式方法声明处异常类型
throw手动生成异常对象的关键字方法体中异常对象
public static void main(String[] args) throws IOException {
    //声明路径地址
    String filepath = "D:\\FFOutput\\1.txt";
    //声明条件
    int read =0;
    //创建导入路径地址的字节输入流的实例化
    FileInputStream fileInputStream = new FileInputStream(filepath);
    //创建一个死循环直到输出所有的字节
    while ((read = fileInputStream.read()) != -1){
        System.out.print((char) read);
    }
    //关闭输入流
    fileInputStream.close();
}
= new FileInputStream(filepath);
    //创建一个死循环直到输出所有的字节
    while ((read = fileInputStream.read()) != -1){
        System.out.print((char) read);
    }
    //关闭输入流
    fileInputStream.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值