学习Java--异常机制

异常机制

异常机制本质:当程序出现异常,程序安全退出,处理完后继续执行的机制。
异常(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调试模式可视化调试
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值