带你全面认识Java中的异常处理

 更新时间:2022年12月26日 10:38:33   作者:学全栈的灌汤包  
在你所写过的代码中,你已经接触过一些异常了,我们可以通过一些简单的代码让我们理解一些简单的异常,下面这篇文章主要给大家介绍了关于Java中异常处理的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下

Java异常处理

异常体系的介绍

什么事异常处理?

异常是程序在“编译”或者“执行”的过程中可能出现的问题,比如: 数组索引越界、空指针异常、 日期格式化异常,等…

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

为什么要学习异常?

异常一旦出现了,如果没有提前处理,程序就会退出JVM虚拟机而终止.

研究异常是为了避免异常,然后提前处理异常,体现的是程序的安全, 健壮性。

Error:是系统级别问题、JVM退出等,代码无法控制

Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题

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

编译时异常和运行时异常:

简单来说:

编译时异常就是在编译的时候出现的异常,

运行时异常就是在运行时出现的异常。

常见运行时异常

运行时异常;

直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。

常见的运行时异常示例:

数组索引越界异常: ArrayIndexOutOfBoundsException

public static void main(String[] args) {
    // 数组索引越界异常: ArrayIndexOutOfBoundsException
    int[] arr = {10, 20, 40};
    System.out.println(arr[0]);
    System.out.println(arr[1]);
    System.out.println(arr[2]);
    System.out.println(arr[3]); // 越界

    // 异常提示: 
    // Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
    //	at com.chenyq.d6_exception.ExceptionDemo.main(ExceptionDemo.java:11)
}

空指针异常 : NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错。

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

    // 异常信息:
    // Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "name" is null
    //	at com.chenyq.d6_exception.ExceptionDemo2.main(ExceptionDemo2.java:6)
}

数学操作异常:ArithmeticException

public static void main(String[] args) {
    int c = 20 / 0; // 数学异常, 分母不能为0

    // 异常信息:
    // Exception in thread "main" java.lang.ArithmeticException: / by zero
    //	at com.chenyq.d6_exception.ExceptionDemo4.main(ExceptionDemo4.java:5)
}

类型转换异常:ClassCastException

public static void main(String[] args) {
        Object obj = 12;
    String str = (String) obj; // 类型转换异常

    // 异常信息
    // Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class
    // java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
    //	at com.chenyq.d6_exception.ExceptionDemo3.main(ExceptionDemo3.java:6
}

数字转换异常: NumberFormatException

public static void main(String[] args) {
    String num1 = "23"; // 可以正常转换
    Integer res1 = Integer.valueOf(num1);
    System.out.println(res1 + 1);

    String num2 = "23aaa"; // 不可以正常转换 数字转换异常
    Integer res2 = Integer.valueOf(num2);
    System.out.println(res2 + 1);

    // 异常信息
    // Exception in thread "main" java.lang.NumberFormatException: For input string: "23aaa"
    //	at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    //	at java.base/java.lang.Integer.parseInt(Integer.java:668)
    //	at java.base/java.lang.Integer.valueOf(Integer.java:999)
    //	at com.chenyq.d6_exception.ExceptionDemo5.main(ExceptionDemo5.java:10)
}

运行时异常:一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误,自己水平问题

常见编译时异常

编译时异常:

不是RuntimeException或者其子类的异常,编译阶段就报错(代码写出来就报错),必须处理,否则代码不通过

编译时异常示例:

编译时异常的作用是什么:

是担心程序员的技术不行,在编译阶段就爆出一个错误, 目的在于提醒代码可能有错误

编译时异常是可遇不可求, 遇到了解决即可。

补充:自定义异常

Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合我们实际情况的异常.

我们可以通过一个例子来说明一下:模拟用户登录,此时就可能抛出两种异常,一种是用户名错误异常,一种是密码错误异常:

我们先写出一段模拟登录的代码

public class winning {
    private static final String ID ="java";
    private static final String Password = "666";
    public static void main(String[] args) {
        System.out.println("请输入你的用户名");
        Scanner scanner=new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的密码");
        String password = scanner.nextLine();
    }
}

定义抛出用户名错误的异常类

//定义一个用户名异常
class NameException extends RuntimeException{
    public NameException(String name){
        super(name);
    }
}

定义抛出密码错误的异常

//定义一个密码异常
class PasswordException extends RuntimeException{
    public PasswordException(String password){
        super(password);
    }
}

我们在进一步完善我们异常处理机制:

public class winning {
    private static final String ID ="java";
    private static final String Password = "666";
    public static void main(String[] args) {
        System.out.println("请输入你的用户名");
        Scanner scanner=new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的密码");
        String password = scanner.nextLine();
        if (!ID.equals(name)){
            throw new NameException("用户名错了");
        }
        if (!Password.equals(password)){
            throw new PasswordException("密码有误");
        }
    }
}

通过这个例子,让我们了解什么是自定义异常类,如何使用异常类,当然以上代码可以进行优化,可以利用设置一个login登录函数,在利用try-catch进行捕获异常。

总结 

到此这篇关于Java中异常处理的文章就介绍到这了,更多相关Java中异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    SpringBoot接入轻量级分布式日志框架(GrayLog)的操作方法

    这篇文章主要介绍了SpringBoot接入轻量级分布式日志框架(GrayLog)的方法,本文通过图文实例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java通过Fork/Join优化并行计算

    Java通过Fork/Join优化并行计算

    这篇文章主要为大家详细介绍了Java通过Fork、Join来优化并行计算,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中用Socket实现HTTP文件上传实例

    Java中用Socket实现HTTP文件上传实例

    本篇文章主要介绍了Java中用Socket实现HTTP文件上传实例,详细的介绍了通过读取Socket的输入流来实现一个文件上传的功能,有兴趣的同学可以一起了解一下
    2017-04-04
  • SpringCloud学习笔记之SpringCloud搭建父工程的过程图解

    SpringCloud学习笔记之SpringCloud搭建父工程的过程图解

    SpringCloud是分布式微服务架构的一站式解决方案,十多种微服务架构落地技术的集合体,俗称微服务全家桶,这篇文章主要介绍了SpringCloud学习笔记(一)搭建父工程,需要的朋友可以参考下
    2021-10-10
  • struts2中通过json传值解决乱码问题的实现方法

    struts2中通过json传值解决乱码问题的实现方法

    这篇文章主要介绍了struts2中通过json传值解决乱码问题的实现方法,涉及js编码及java解码的相关操作技巧,需要的朋友可以参考下
    2016-06-06
  • eclipse自动创建SpringBoot项目报错的解决

    eclipse自动创建SpringBoot项目报错的解决

    这篇文章主要介绍了eclipse自动创建SpringBoot项目报错的解决方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • IDEA一键生成方法的序列图神操作

    IDEA一键生成方法的序列图神操作

    为了能够更快更清晰地搞清对象之间的调用关系,我经常需要用到序列图。手动画序列图还是很麻烦费时的,不过 IDEA 提供了一个叫做SequenceDiagram 的插件帮助我们解决这个问题。通SequenceDiagram 这个插件,我们一键可以生成时序图
    2022-01-01
  • 实例讲解Java并发编程之ThreadLocal类

    实例讲解Java并发编程之ThreadLocal类

    这篇文章主要介绍了实例讲解Java并发编程之ThreadLocal类,本文给出了模拟ThreadLocal、实用ThreadLocal等代码实例,需要的朋友可以参考下
    2015-04-04
  • MyBatis Generator去掉生成的注解

    MyBatis Generator去掉生成的注解

    这篇文章主要介绍了MyBatis Generator去掉生成的注解的相关资料,非常不错具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • 在eclipse导入Java的jar包的方法JDBC(图文说明)

    在eclipse导入Java的jar包的方法JDBC(图文说明)

    这篇文章主要介绍了在eclipse导入Java 的jar包的方法 JDBC 图文说明 ,需要的朋友可以参考下
    2015-09-09

最新评论