java异常--看这一篇就够了

写在前面:觉得有帮助的话大家可以点在评论支持哈哈
陌生人我们一起加油

文章目录


准备好了吗,要学习新的内容了
在这里插入图片描述

异常基本概念

Java语言中将程序执行发生的不正常情况称为异常(开发中的语法错误和逻辑错误不是异常)

异常体系图

下面让我们来一起看一看异常体系图吧
在这里插入图片描述异常体系图小结

  • 异常分为编译异常和运行异常
  • 运行异常是编译器检测不出来的异常,可不做处理,因为这类异常很普遍,一般是编程时的逻辑错误,程序员应该注意避免出现的异常
  • 编译异常是编译器要求必须处置的异常

五大常见运行时异常

在异常体系图中我们已经列出来了五个常见的运行时异常.
它们分别是空指针异常,算术异常,数组越界异常,类型转化异常和数字格式异常
下面就让我们来进一步认识这几个异常吧

1.NullPointerException空指针异常

所谓空指针异常就是当程序在需要对象的地方使用null时就会抛出异常
下面我们来看一段代码

public class NullPointer {   //空指针异常
    public static void main(String[] args) {
        String name=null;
        System.out.println(name.length());
    }
}

果然结果不出所料,程序报错了,空指针异常
在这里插入图片描述

2.ArithmeticException数序运算异常

出现异常的算术条件时抛出异常,比如 一个整数除于0的时候抛出异常

3.ArrayIndexOutBoundsException 数组下标越界异常

用非法索引访问数组时抛出的异常 ,如果索引为负或大于等于数组大小,该索引就是非法索引
下面来看一段数组下标越界异常的代码

public class ArrayIndexOutOfBoundsException {//数组越界
    public static void main(String[] args) {
        int [] arr={1,2,4};
        System.out.println(arr[3]);
    }
}

运行结果也是报错
在这里插入图片描述

4.ClassCastException类型转换异常

当试图将对象强制转换为不是实例的子类时抛出该异常
代码如下

public class ClassCastException { //类型转化异常
    public static void main(String[] args) {
        A b = new B(); //父类引用指向子类对象,向上转型
        B b1=(B)b;   //向下转型,这里运行正确
        C c2=(C)b;//把b指向的对象转给C,因为B类和C类没有关系,所以这就是类型转换异常,会报错
    }
}
class A{}
class B extends A{}
class C extends A{}

运行结果报错
在这里插入图片描述

5.NumberFormatException数字格式不正确异常

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换成该格式的时候抛出该异常,通过这个方法我们可以确保输入是满足条件的数字
代码如下

public class NumberFormatException { //数字格式不正确异常
    public static void main(String[] args) {
        String name="李文浩";
        //将String转换为int
        int num=Integer.parseInt(name); //name字符串无法转换成整数,这里会抛出NumberFormatException
        System.out.println(num);
    }
}

运行结果抛出数字格式不正确异常

在这里插入图片描述

常见编译异常

  • SQLException 操作数据库时查询表可能发生异常
  • IOException 操作文件时,发生异常
  • FileNotFoundException 当加载一个不存在的文件时,发生异常
  • ClassNotFoundException 加载类,而该类不存在时发生异常
  • EOFException 操作文件 到文件末尾发生异常
  • IIIegalArgumentException 参数异常

异常处理

前面我们已经了解了很多关于异常的知识,那么,当遇到这些异常时我们该如何处理呢,让我们来学习一下吧

方式一:try-catch-finally

IDEA中try-catch-finally的快捷键是ctrl+alt+t
try-catch-final的处理机制如下

  • 异常发生了那么异常发生后面的代码不会执行直接进入catch块
  • 异常没有发生,则顺序执行try的代码块,不会进入到catch
  • 异常是否发生都要执行finally块里面的代码(通常是关闭连接,释放资源等)
  • 如果try代码块可能有多个异常,可以使用catch分别捕获不同的异常要求子类异常写在前面,父类异常写在后面,因为父类异常一旦写在前面就会包含子类异常,那么子类异常就没有意义了
  • 也可以使用try-finally,这种用法相当于没有捕获异常,程序会崩掉,应用场景,就是执行一段代码,不管是否发生异常都必须执行某个业务逻辑
try {
           //代码即有可能有异常的代码
        } catch (Exception e) {
            //捕获到异常
            //当异常发生时系统将异常封装称Exception对象e,传递给catch
            //得到异常对象后程序可以自己处理,即可添加要操作的内容
            //如果没有发生异常那么catch代码块就不执行
        } finally {
            //不管try代码块是否有异常发生,都要执行final
            //所以通常将释放资源的代码放在finally
            //没有finally语法上也是通过的
        }

try-catch的一个经典应用场景
如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止

public class TrycatchExercise04 {
    public static void main(String[] args) {
        //当用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
        Scanner scanner = new Scanner(System.in);
        int num = 0;
        String inputStr = "";
        while (true) {
            System.out.println("请输入一个整数");
            inputStr = scanner.next();
            try {
                num=Integer.parseInt(inputStr);//这里可能抛出异常
                break;   //Integer.parseInt就是将一个String类型的整数转换成int类型的整数,比如"123'=>123
            } catch (java.lang.NumberFormatException e) {
                System.out.println("你输入的不是一个整数");
            }
        }
        System.out.println("你输入的值是"+num);
    }
}

方式二:throws

throws通俗的讲就是甩锅,当程序遇到异常时使用throws就是将这个异常甩给方法调用者直到jvm机,jvm机直接输出异常信息并结束程序
在这里插入图片描述如果没有显式使用try-catch-finally和throws方法,那么系统默认的是throws方法

那么我们可以回想一下我们之前写过的程序,如果程序有异常时我们没有写try-catch-finally和throws的情况下运行时还是会有异常信息,那么这是怎么回事呢?
在这里插入图片描述

哈哈,那其实是我们的程序默认有了throws处理异常的方法
你以为的程序:

public static void main(String[] args) {

实际上的程序:

 public static void main(String[] args) throws Exception {

所以当我们程序有异常时,会有默认的throws将异常扔给顶级的jvm把信息输出并结束程序

关于throws有一个细节:
子类重写父类方法时,对抛出异常的规定:子类重写的方法所抛出的异常要么和父类类型抛出的异常一致,要么为父类抛出的异常类型的子类型

class Father{ //父类
    public void method() throws RuntimeException{
    }
}
class Son extends Father{ //子类
//子类重写父类方法时,对抛出异常的规定:子类重写的方法
//所抛出的异常要么和父类类型抛出的异常一致,要么为父类抛出的异常类型的子类型
    @Override
    public void method() throws NullPointerException{
    }
}

好了关于异常处理的这些你学会了吗,记得一件三连交学费哦
在这里插入图片描述

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一心向上的文浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值