带你全面认识Java中的异常处理
学全栈的灌汤包 人气:0Java异常处理
异常体系的介绍
什么事异常处理?
异常是程序在“编译”或者“执行”的过程中可能出现的问题,比如: 数组索引越界、空指针异常、 日期格式化异常,等…
注意:语法错误不算在异常体系中。
为什么要学习异常?
异常一旦出现了,如果没有提前处理,程序就会退出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进行捕获异常。
总结
加载全部内容