【Java寒假打卡】Java基础-异常

异常概述

在这里插入图片描述
Exception:称之为异常类,他表示程序本身可以处理的问题

  • RuntimeException及其子类:运行时异常。(空指针异常,数组索引越界异常)
  • 除了RuntimeException之外的所有异常:编译期间必须处理的,否则程序不能通过编译(日期格式化异常)

在这里插入图片描述

异常:就是程序出现了不正常的情况。程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止

注意:语法错误不算在异常体系中

JVM的默认处理方案

如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理,如果自己写出异常处理的代码,将执行自己写的异常处理语句

  • 将异常的名称,异常的原因以及异常出现的位置等信息输出在控制台
  • 程序停止执行

throws声明异常

格式: throws 异常类名

注意:这个格式是写在方法的定义处,表示声明一个异常。

  • 出现空指针异常
package com.hfut.edu.test3;

public class test7 {
    public static void main(String[] args) {
        method1();
    }

    private static void method1() throws  NullPointerException{
        int[] arr = null;// 爆出空指针异常
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }


}
  • 出现了解析异常
package com.hfut.edu.test3;

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

public class test7 {
    public static void main(String[] args) throws ParseException {
        method1();
        method2();
    }

    private static void method1() throws  NullPointerException{
        int[] arr = null;// 爆出空指针异常
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    // 告诉调用者 可能会出现异常
    // 如果方法中没有出现异常 那么正常执行
    // 如果方法中真的出现了异常 其实也是将这个异常交给了调用者处理
    private static void method2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date parse = sdf.parse("2048年10月10日");// 将指定的时间字符串按照指定格式解析成Date对象
    }
}

注意: 声明的异常是一个运行时的异常,那么声明的代码可以省略,如果声明的异常是一个编译时的异常,那么声明异常的代码必须手动写出

package com.hfut.edu.test3;

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

public class test7 {
    public static void main(String[] args) throws ParseException {
        method1();
        method2();
    }
    
    // 运行时异常 声明异常的代码不需要写出
    private static void method1() throws  NullPointerException{
        int[] arr = null;// 爆出空指针异常
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
    // 告诉调用者 可能会出现异常
    // 如果方法中没有出现异常 那么正常执行
    // 如果方法中真的出现了异常 其实也是将这个异常交给了调用者处理
    // 编译时异常 声明异常的代码必须手动写出
    private static  void method2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date parse = sdf.parse("2048年10月10日");// 将指定的时间字符串按照指定格式解析成Date对象
    }
}

throw抛出异常

throws:

  • 用在方法声明后面,跟的是异常类名
  • 表示声明异常,调用该方法有可能会出现这样的异常

throw:

  • 用在方法体内部,跟的是异常对象名
  • 表示手动抛出异常对象,由方法体内的语句处理

在这里插入图片描述

package com.hfut.edu.test3;

public class test8 {
    public static void main(String[] args) {
        int[] arr= null;
        printArr(arr);// 接收到异常 将异常丢给JVM虚拟机
    }

    private static void printArr(int[] arr) {

        if(arr == null){
            // 手动 创建异常对象 抛给调用者  让该方法停止
            throw new NullPointerException();// 抛出空指针异常
        }
        else{
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }
}


try-catch 抛出异常

在这里插入图片描述

好处:为了能让代码继续运行下去

package com.hfut.edu.test3;

public class test8 {
    public static void main(String[] args) {
        int[] arr= null;
//        printArr(arr);// 接收到异常 将异常丢给JVM虚拟机

        // 使用try-catch 可以让代码继续运行下去
        try{
            printArr(arr);
        }catch(NullPointerException e){
            // 捕获到空指针异常 进行的操作
            System.out.println("参数不能是NULL");
        }

        System.out.println("代码可以正常执行下去");
    }

    private static void printArr(int[] arr) {

        if(arr == null){
            // 手动 创建异常对象 抛给调用者  让该方法停止
            throw new NullPointerException();// 抛出空指针异常
        }
        else{
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }
}

package com.hfut.edu.test3;

import java.util.Scanner;

public class test9 {
    public static void main(String[] args) {

        try {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你的年龄");
            String line = sc.nextLine();// 输入字符串
            // 将字符串转换成整数
            int age = Integer.parseInt(line);// 将整数字符串转换成Integer对象 然后自动拆箱成int整数

            System.out.println(age);
            System.out.println("测试123");
        } catch (NumberFormatException e) {
            // 捕获到异常
//            throw new RuntimeException(e);
            System.out.println("出现了异常 但是代码正常执行下去");
        }

        System.out.println("代码正常执行下去");
    }
}

注意:

  • 如果try中没有遇到异常,指定try中的代码
  • 如果try中遇到问题,执行catch中的代码
  • 如果出现的问题没有被捕获,程序报错,默认交给JVM处理
  • 出现多个异常 写出多个catch进行捕获即可,如果多个异常之间存在子父类关系,那么父类一定要写在下面
package com.hfut.edu.test3;

import java.util.Scanner;

public class test9 {
    public static void main(String[] args) {

        try {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你的年龄");
            String line = sc.nextLine();// 输入字符串
            // 将字符串转换成整数
            int age = Integer.parseInt(line);// 将整数字符串转换成Integer对象 然后自动拆箱成int整数
            System.out.println(age);
            System.out.println("测试123");
            System.out.println(2 / 0);
        } catch (NumberFormatException e) {
            // 捕获到异常
//            throw new RuntimeException(e);
            System.out.println("出现了异常 但是代码正常执行下去");
        }catch(ArithmeticException e){
            System.out.println("数学运算异常 捕获多个异常");
        }

        System.out.println("代码正常执行下去");
    }
}

throwable的成员方法

  • getMessage():返回此throwable的详细消息字符串
  • toString():返回此可抛出的简短描述
  • printStackTrace():将异常的错误信息输出在控制台
package com.hfut.edu.test3;

public class test10 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,45};

        try {
            System.out.println(arr[11]);
        } catch (ArrayIndexOutOfBoundsException e) {
            // 数组越界异常
            e.getMessage();
            e.toString();
            e.printStackTrace();// 将异常的错误信息输出在控制台中
        }

        System.out.println("xxxxxxxxxxxx");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

少写代码少看论文多多睡觉

求打赏,求关注,求点赞

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

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

打赏作者

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

抵扣说明:

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

余额充值