JAVA入门之异常 笔记(34)

一、异常概念引入

package TEXT;

public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        System.out.println(arr[3]);
    }
}

当我们执行以上java程序的时候,会发现出错了

在这里插入图片描述

这个错误是一个非常简单的错误,只是数组索引出界
而这个也是一种异常,一种可以通过修改代码修复的异常
ArrayIndexOutOfBoundsException
通过查询帮助文档
在这里插入图片描述
ArrayIndexOutOfBoundsException是继承了异常类Throwable的类
在JAVA面向对象中,异常也是被封装成了一个对象,这个对象继承了Throwable类

那么官方术语异常是什么呢?
异常是指在程序运行中代码产生的一种错误。

二、Throwable类

Throwable类是类库java.lang包中的一个类,它派生出两个子类,Error类和Exception类

Error类代表了JAVA内部的错误或者某些硬件的错误,比如内存溢出错误,栈溢出错误,系统内部错误等等,不能通过修改代码来实现解决该错误,
因此,Error类的错误被认为不能恢复的严重错误
所以,我们在写代码的时候,要尽量避免Error类的错误

而Exception类是用户程序能够捕捉到的异常情况,一般情况下,Exception类通过产生它的子类来创建自己异常,而这个异常可以通过修改代码以达到修复该异常的作用

三、异常处理

1. try…catch…finally

try{
可能产生异常的代码
}
catch(Exception e1){
对e1异常的处理
}
catch(Exception en){
对en异常的处理
}
finally{
一定会运行的语句序列
}

在这里插入图片描述

package TEXT;

public class Demo {
    public static void main(String[] args) {
        System.out.println("开始");
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[3]);
        }catch (Exception e){
//            System.out.println("数组索引出界");
            e.printStackTrace();
        }
        System.out.println("结束");
    }
}

在这里插入图片描述

用了这个处理异常之后,当程序遇上异常后,不再像以前那种直接退出程序而是可以继续往下执行,这在我们以后开发软件非常实用,我们开发出来的软件,如果遇到异常后直接退出程序,那么将会给用户不好的体验,因此我们希望的是程序遇到异常可以往下执行,并且把异常报出来。

2. throws

try…catch…可以对异常进行处理,但是不是所有的情况我们都有权限进行异常的处理
也就是说,有些时候可能会出现我们处理不了的,这时候该怎么办呢?
针对这种情况下,JAVA提供了throws的处理方法

格式:
throw 异常类名

注意 :这个格式时跟在方法的括号后面的

package TEXT;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo_1 {
    public static void main(String[] args) {
        System.out.println("开始");
        method();
        System.out.println("结束");
    }
    //运行时异常
    public static void method() throws ArrayIndexOutOfBoundsException{
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
    }

}

在这里插入图片描述

通过这个这个的运行结果可以看出来,并没有执行输出”结束“,因此throws处理异常并不是真正处理异常而是只是把这个异常抛出了,如果想要继续往下执行,那么需要对method继续使用try…catch,所以这仅仅时延迟了异常

3.总结

在这里插入图片描述

四、Throwable的成员方法

在这里插入图片描述

1、getMessage——用于输出异常的原因

package TEXT;

public class Demo {
    public static void main(String[] args) {
        System.out.println("开始");
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[3]);
        }catch (Exception e){
//            System.out.println("数组索引出界");
//            e.printStackTrace();
            System.out.println(e.getMessage());//异常的原因
        }
        System.out.println("结束");
    }
}

在这里插入图片描述

2、toString——用于输出异常的类名以及异常原因

package TEXT;

public class Demo {
    public static void main(String[] args) {
        System.out.println("开始");
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[3]);
        }catch (Exception e){
//            System.out.println("数组索引出界");
//            e.printStackTrace();
//            System.out.println(e.getMessage());//异常的原因
            System.out.println(e.toString());//异常类名以及异常原因
        }
        System.out.println("结束");
    }
}


在这里插入图片描述

3、printStackTrace——把异常信息输出

package TEXT;

public class Demo {
    public static void main(String[] args) {
        System.out.println("开始");
        int[] arr = {1, 2, 3};
        try {
            System.out.println(arr[3]);
        }catch (Exception e){
//            System.out.println("数组索引出界");
            e.printStackTrace();//把异常信息输出
//            System.out.println(e.getMessage());//异常的原因
//            System.out.println(e.toString());//异常类名以及异常原因
        }
        System.out.println("结束");
    }
}


在这里插入图片描述

五、编译异常与运行异常

JAVA中的异常被分为两大类:编译异常和运行异常,也被称为受检异常和非受检异常
所有的RuntimeException类及其子类被称为运行时异常,其他的异常都是编译时异常

  • 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
  • 运行时异常:无需显示处理,也可以和编译时异常一样处理
package TEXT;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Demo_1 {
    public static void main(String[] args) {
        method();
        method2();
    }
    //运行时异常
    public static void method(){
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    //编译时异常
    public static void method2(){
        try {
            String s = "2020-09-01";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date d = sdf.parse(s);//这里报错只是为了说可能有异常
            System.out.println(d);
        }catch (ParseException e){
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

六、自定义异常

在我们编写程序的时候,会遇到各种各样的异常,但是,并不是所有的异常都是JAVA实现封装成对象的,因此自定义异常的作用就出来了,在自定义异常类中通过编写新的方法来处理相关异常

那么我们怎么创建属于自己的异常呢?
我们只需要在建立异常的时候,继承Exception或者RuntimeException即可

在这里插入图片描述

package TEXT_1;
/*
自定义分数异常
 */
public class ScoreException extends Exception{
    public ScoreException() {
    }

    public ScoreException(String message) {
        super(message);
    }
}

package TEXT_1;
/*
老师对象类
 */
public class Teacher {
    public void checkScore(int score) throws ScoreException{
        if (score < 0 || score > 100){
//            throw new ScoreException();//抛出自定义异常对象,但是一般不给空
            throw new ScoreException("你给的分数有误,应该给0~100!!!");
        }else {
            System.out.println("分数正常");
        }
    }
}

package TEXT_1;
/*
测试类
 */
import java.util.Scanner;

public class TeacherTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入分数:");
        int score = sc.nextInt();

        Teacher t = new Teacher();
        //checkScore方法抛出一个异常,而这个异常继承的时Exception,所有这个时一个编译时异常
        try {
            t.checkScore(score);
        } catch (ScoreException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

七、throws和throw的区别

在这里插入图片描述

注意:抛出异常,不一定会有异常,当出现异常才会有异常

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

起名方面没有灵感

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

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

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

打赏作者

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

抵扣说明:

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

余额充值