第五章Java异常

在这里插入图片描述

  戳我跳到个人主页

  本人码云(建议pc端打开,手机可能会出现字体过小问题。)
  本人会不定期在码云上更新一些算法或数据结构的基础程序,后期也会学习进阶程序,也会更新大厂的面试题。
  如果您有好的建议和想法,欢迎在本人码云相应代码评论区评论哦。希望大家都能在编程这条路上越走越远。也祝看到这篇博客的人,能真正搞懂这方面知识,当然,若有错误,请提出改正,谢谢大家啦。

  本人后续会在这里更新操作系统和计组的笔记,敬请期待!
  有赞必回,评论必回,顺着网线回访!

异常的基本语法

异常:程序没按照预计的结果运行,在运行过程中发生了“错误”。
在这里插入图片描述异常的基本语法:
try{
//可能会产生异常的代码,除0,数组越界,空指针等
}
[catch 0..N个]{
//出现异常以后如何处理
}
[finally]{
//异常的出口,最终会执行的代码块
}
catch, finally 为可选,可写可不写

其实try语句后面是可以省略catch语句的,但是必须有finally语句。也可以省略finally语句,但是必须要有catch语句。也就是说try语句后面必须要有一个别的语句跟在后面。有如下三种:
try-catch
try-finally
try-catch-finally

1.程序中不处理异常

在这里插入图片描述

2.使用try … catch … 处理异常

在这里插入图片描述

我们发现,一旦try中出现异常,那么try代码块中的其他程序就不会继续执行,而是交给catch中的代码来执行,catch执行完毕后继续向下执行

3.异常类

Java中一切都是类,异常其实也是类,因此catch代码块只能捕获相应的异常“类型”
在这里插入图片描述
例:
在这里插入图片描述

有一个异常类是所有异常类的父类,Exception

我们如果catch块中捕获的是Exception类型,那么就可以接受所有的异常类型。(自动向上转型

这样虽然可以一劳永逸,但是不推荐,因为这样写,不知道异常产生的具体原因,如果很清楚异常产生的类型,建议还是写对应的Exception的子类异常。
在这里插入图片描述

4.关于错误“堆栈”信息

如果想要输出程序出现异常的位置以及原因,就调用异常对象printStackTrace方法 e.printStackTrace();
在Java中,出现问题很好解决,异常的错误信息非常完善,到底在哪一行出现了什么错误,说的非常清楚。
在这里插入图片描述

5.关于finally代码块

无论是否有异常产生,最终都会执行finally代码块 (易错)
在这里插入图片描述
在这里插入图片描述猜猜这个ret是多少?
在这里插入图片描述不可思议是 30
在这里插入图片描述finally作为最终都会执行的代码块,若finally中存在返回值,覆盖掉try或者catch的返回值
所以,不要在finally代码块中写返回值

一般来说资源的释放,方法的关闭操作都在finally代码块中。 比如关闭数据库的连接,关闭文件的操作都在finally块中,无论是否有异常产生,都能保证资源得到释放。

6.异常处理

流程
在这里插入图片描述

7.throws和throw关键字

人为抛出异常

  • throws: 用在方法声明上,表示该方法可能会产生的异常类型,但是本方法中不处理该异常。若异常产生抛回给调用者
  • throw: 用在方法内部,表示人为产生异常对象并抛出
    异常对象的产生都是发生异常后由JVM产生的,若需要人为产生异常对象,就使用throw关键字
    这是抛出异常,真正出错了如果我用e.printStackTrace();会怎么样?
    在这里插入图片描述

8.异常体系

JDK内部异常的继承关系
Java中的异常分为两大类,一类称之为 “受查异常”,另一类称为 “非受查异常”。
在这里插入图片描述

  • RuntimeException以及其子类包括Error及其子类称之为非受查异常, 编译阶段可以不显示进行异常处理(try … catch / throw 抛出等等)。即蓝色部分的类

  • 除了非受查异常以外的其他异常都是受查异常,必须在编译阶段显示进行异常的处理,否则编译就会出错。即红色部分的类

  • RuntimeException:运行时异常,编译阶段不报错,运行时出错。
    常见的运行时异常
    ArrayIndexofBoundsException - 数组越界异常
    NullPointerException - 空指针异常
    ClassCaseException - 类型转换异常
  • Error:程序内部错误,一般来说出现这种错误,程序没法再正常执行下去,只能退出程序。
    OutofMemoryError - 堆内存溢出错误
    StackOverflowError - 栈溢出错误

代码体验:

非受查异常
在这里插入图片描述
受查异常,必须在编译阶段进行异常的处理
在这里插入图片描述这个抛出的这个异常是受查异常,调用者必须显示处理
在这里插入图片描述
这个代码因为没有file文件,将会产生FileNotFoundException异常,由于FileInputStream这个类它抛出了这个异常,交给调用者去处理,我自己写的IOException这个类中的main方法就是调用者,如果我不想处理,那我让main也抛出这个异常就好了。

显示处理:

1.进行 try…catch…finally 捕获这个异常
在这里插入图片描述在这里插入图片描述2.调用者也使用 throws 向上抛出
在这里插入图片描述在这里插入图片描述

9.自定义异常

JDK内部已经帮我们提前定义好了很多的异常类,但是在某些业务场景下,出现的错误需要我们自定义异常类(用户登陆的时候,用户名不对,密码不对等等)
自定义异常类非常简单,只需要继承相关的两个父类就可以。

若希望这个异常类必须显示处理 - 继承Exception父类
若希望这个异常类不需要显示处理 - 继承RuntimeException父类

package java_exception_test;

import java.net.PasswordAuthentication;
import java.sql.SQLOutput;
import java.util.Scanner;

public class MyExceptionTest
{
    private static final String USER_NAME = "lee";
    private static final String PASSWORD = "12345";


    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String userName = sc.nextLine();
        System.out.println("请输入密码:");
        String pass = sc.nextLine();
        if( !USER_NAME.equals(userName) )
        {
            //用户名错误异常

            //先创建一个用户名错误的异常类的对象
            UserNameException e = new UserNameException("用户名错误异常");
            //再抛出这个异常对象
            throw e;
        }
        if( !PASSWORD.equals(pass) )
        {
            //密码错误异常
            throw new PassWordException("密码错误异常");
        }
    }
}

//创建两个异常类,继承RuntimeException
//非受查异常 - 不需要进行显示处理
class UserNameException extends RuntimeException
{
    //构造方法
    public UserNameException(String msg)
    {
        super(msg);
    }
}
class PassWordException extends RuntimeException
{
    //构造方法
    public PassWordException(String msg)
    {
        super(msg);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_小树

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

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

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

打赏作者

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

抵扣说明:

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

余额充值