异常机制
异常机制本质:当程序出现异常,程序安全退出,处理完后继续执行的机制。
异常(Exception)的概念
异常指的是程序运行过程中出现的非正常现象,例如除数为零、需要处理的文件不存在、数组
下标越界等。
在Java的异常处理机制中,引进了很多用来描述和处理异常的类,成为异常类。异常类定义中
包含了该类异常的信息和对异常信息进行处理的方法。
例如看看第一个异常对象,并分析一下异常机制是如何工作的。
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
System.out.println("111");
try{
int a=1/0;
}
catch (Exception e){
e.printStackTrace();
}
System.out.println("222");
}
}
程序在执行“1/0”仍然遇到异常,然后进行try-catch处理。处理完毕后,程序继续往下执行,
打印了“222”内容。
Java是采用面向对象的方式处理异常的。
处理过程:
1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前
执行路径,并把异常对象交给JRE.
2.捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从而
生成异常的方法开始回溯,直到找到相应的异常处理代码为止。
Error
Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作
无关,而表示代码运行时JVM(Java虚拟机)出现的问题。例如,Java虚拟机运行错误,当JVM不再
继续执行操作所需要的内存资源时,将出现OutOfMemoryError.这些异常发生时,Java虚拟机(JVM)
一般会选择线程终止。
Error表明系统JVM已经处于不可恢复的崩溃状态中。
Error与Exception的区别
1.我开着车走在路上,一头猪冲在路中间,我刹车。这叫一个异常。
2.我开着车在路上,发动机坏了,我听车,这叫错误。系统处于不可恢复的崩溃状态。发动机什么时候
坏?我们普通司机能管吗?不能,发动机什么时候坏事汽车厂发动机制造商的事情。
Exception
Exception是程序本身能够处理的异常。
Exception类似所有异常类的父类,其子类对应了各种各样可能出现的异常事件。通常Java的异常可分为:
1.RuntimeException 运行时异常
2.CheckedException 已检查异常
编译器不处理RuntimeException,程序员需要增加“逻辑处理来避免这些异常”
示例1:ArithmeticException异常:试图除以0
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
int b=0;
System.out.println(1/b);
}
}
若直接运行,则会出现Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.itbaizhan.Test01.main(Test01.java:6)
这种错误在代码逻辑上稍加改正即可
改正后的代码:
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
int b=0;
if(b!=0)
System.out.println(1/b);
}
}
示例2:空指针异常NullPointerException
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
String str=null;
System.out.println(str.charAt(0));
}
}
若直接运行,则会出现Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.charAt(int)" because "str" is null at com.itbaizhan.Test01.main(Test01.java:6)的错误
咋这种代码上加一个判断条件即可
改正后的代码:
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
String str=null;
if(str!=null)
System.out.println(str.charAt(0));
}
}
示例3:ClassCastException异常(类型转换异常)
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
Animal a=new Dog();
Cat c=(Cat)a;
}
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
若将猫强制转换为狗,显然是不行的,cat不能转换为dog。
若直接转换会报错Exception in thread "main" java.lang.ClassCastException: class com.itbaizhan.Dog cannot be cast to class com.itbaizhan.Cat (com.itbaizhan.Dog and com.itbaizhan.Cat are in unnamed module of loader 'app')
at com.itbaizhan.Test01.main(Test01.java:6)
应先判断是不是cat类型,是cat类型才转换,不是cat类型则不转换。
改正后的代码为:
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
Animal a=new Dog();
if(a instanceof Cat){
Cat d=(Cat) a;
}
}
}
class Animal{
}
class Dog extends Animal{
}
class Cat extends Animal{
}
示例4:ArrayIndexOutOfBoundException异常(数组越界异常)
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
int[]arr=new int [5];
System.out.println(arr[5]);
}
}
直接运行会由于数组越界而报错Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5at com.itbaizhan.Test01.main(Test01.java:6)
只需要添加一个条件语句进行判断即可
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
int[]arr=new int [5];
int index=5;
if(index>=0&&index<=arr.length)
System.out.println(arr[index]);
}
}
示例5NumberFormaException(数字格式化异常)
package com.itbaizhan;
public class Test01 {
public static void main(String[] args) {
String str="1234abcf";
System.out.println(Integer.parseInt(str));
}
}
该代码段由于字符串中含有字母,直接转化会报错,Exception in thread "main" java.lang.NumberFormatException: For input string: "1234abcf"
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.parseInt(Integer.java:786)
at com.itbaizhan.Test01.main(Test01.java:6)
与前面几种解决方法类似,加一个判断字符串中是否含有除数字以外的其他字符。如果没有才进行转换。
修改后的代码如下:
package com.itbaizhan;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test01 {
public static void main(String[] args) {
String str="1234abcf";
Pattern p=Pattern.compile("^\\d+$");
Matcher m=p.matcher(str);
if(m.matches()){//如果str匹配代表数字的正则表达式,才会转换
System.out.println(Integer.parseInt(str));
}
}
}
大纲 | 知识点 | ||||
异常机制 | 异常机制的本质 | ||||
异常的概念 | |||||
异常的分类 | |||||
异常的处理 | try-catch-finally | ||||
throws申明异常 | |||||
try-witch-resource新特性 | |||||
自定义异常 | |||||
百度处理异常 | 处理异常的步骤 | ||||
百度:超级搜索 | |||||
debug调试模式 | 可视化调试 |