Java 异常

Java 异常


Java 异常概念


  • 广义异常:指一切的不正常(程序余下出现的不正常情况)
    Exception:通过异常处理机制处理,处理之后程序可以继续向下执行。
    Error :Java 虚拟机无法解决的严重问题。如:对象内存不够,程序无法执行。一般无法处理。
  • Java 中异常:Exception
    运行时程序出现的一般问题,可以使用异常处理机制处理的情况
  • 常见的异常(Exception)
  • 数组越界
  //数组越界
        int [] a = new int[5];
        a[5] = 10;//java.lang.ArrayIndexOutOfBoundsException 异常类型 Create breakpoint 异常原因

在这里插入图片描述

  • 算数异常
 //算数异常
        int a = 10;
        int b = 0;
        int c = a / b; //java.lang.ArithmeticException 异常类型
        System.out.println(c);

在这里插入图片描述

  • 空指针
//空指针
        String str = null;
        str.length();//java.lang.NullPointerException 异常类型

在这里插入图片描述

  • 类型转换
//类型转换
        
        Object str = "abc";
        Integer i = (Integer) str;//java.lang.ClassCastException 异常类型

在这里插入图片描述

  • 数字格式化
//数字格式化
        new Integer("a");//java.lang.NumberFormatException

在这里插入图片描述

异常的体系


  • Java 中将程序中有可能出现的每一类问题,都包装成了一个类,当出现对应的某类异常时,虚拟机会抛出对应的类信息。

  • 解决办法
    1.默认抛出异常信息
    2.通过异常处理机制处理它。在编码时,就需要对有可能出现问题的代码进行处理。

  • Throwable类
    有两个直接子类:Exception类,Error类。
    在这里插入图片描述

  • 异常分为运行期异常编译期异常两种

  • 运行期异常
    程序运行时抛除的异常,所有RuntimeException的子类都 是运行期异常。

  • 编译期异常(检测异常)
    除去运行期的异常都是编译期异常。

异常处理


  • Java 异常处理的五个关键字::try、catch、 finally、throw、throws
  • try,catch
    语法:
try {
            System.out.println("运行前");
            int a = 10,b = 0;
            new Integer(1);
            int c = a / b;
            System.out.println("运行后");
        }catch (ArithmeticException a){//精确异常类型  处理办法不是把坏的处理好了
            a.printStackTrace();
            System.out.println(a.getMessage()); //将异常原因打出来
        }catch (Exception e){//当不知道是什么异常时
            e.printStackTrace();
        }
        System.out.println("a");

在这里插入图片描述

  • finally

  • 处理异常类型

//处理异常
try {
            System.out.println("运行前");
            int a = 10,b = 1;
            new Integer("abc");
            int c = a / b;
            System.out.println("运行后");
        }catch (ArithmeticException a){
            a.printStackTrace();
            a.getMessage(); 
        }catch (Exception e){
            e.printStackTrace();
        }finally {//无论try{}中代码块是否异常,finally{}代码块一定会执行
            System.out.println("aaaaaaaaaa");
        }
        System.out.println("a");//此处可以输出

在这里插入图片描述

  • 不处理异常类型
 //不处理异常
        try {
            System.out.println("运行前");
            int a = 10,b = 1;
            new Integer("abc");
            int c = a / b;
            System.out.println("运行后");
        }finally {//无论try{}中代码块是否异常,finally{}代码块一定会执行
            System.out.println("aaaaaaaaaa");
        }
        System.out.println("a");//此处不执行

在这里插入图片描述

  • 返回类型
public static int test() {
        try {
            System.out.println("运行前");
            int a = 10, b = 0;
            int c = a / b;
            return c;
        } catch (Exception e){
            e.printStackTrace();
            return -1;
        }finally {//无论try{}中代码块是否异常,finally{}代码块一定会执行
            System.out.println("aaaaaaaaaa");
        }
    }

在这里插入图片描述

throws和throw


  • 关键字 throws
    定义一个方法时可以使用throws在方法参数后声明,表示此方法不处理异常,而交给方法调用处根据情况是否进行处理
  • 我们在调用throws声明的方法时,若不想处理异常,可以继续向上抛出,交给上层处理,若已经抛到main方法时,就不能再抛了,不然就抛给java虚拟机,然而虚拟机并不会处理。
  • Exception 体系下又分为:
    编译异常(检查异常):没有继承RuntimeException,编译时就强制要处理。
    运行期异常:继承 RuntimeException,在编译器间不需要强制处理。
public static void main(String[] args) {

        //在main方法时,已经是最顶层,就不能再抛了,不然就抛给java虚拟机,然而虚拟机并不会处理。
        try {
            test1();//此处已经为main方法,为最高层,就不能再抛了,不然就抛给java虚拟机,然而虚拟机并不会处理。
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }finally {
            System.out.println("异常已经处理,输出继续想执行的语句");
        }

    }

    public static void test1() throws UnsupportedEncodingException {

        test2();//下层经过throws 声明,已经将问题抛过来,此处仍然可能出现异常,此处根据情况是否处理,若不想处理,仍然可以继续向上抛出
    }

    public static void test2() throws UnsupportedEncodingException {

        try {
            "abc".getBytes("UTF-8");//此方法可能出现异常,此处不处理可以向上抛,交给上一层处理
        }finally {
            System.out.println("需要继续执行的语句");
        }

    }
  • 关键字 throw
    在方法体内,抛出一个异常的对象,抛出后,程序不继续向下执行,一般在方法中不符合业务逻辑要求时,可以主动使用throw抛出异常
public static void main(String[] args) {

        Index(11);
        }
public static void Index(int Index){
        int [] a = new int[10];
        if(Index<0||Index>=a.length){
            throw new ArrayIndexOutOfBoundsException(Index+"数组下标越界");
        }else {
            System.out.println("数组下标未越界");
        }

    }

在这里插入图片描述

自定义异常


  • 自定义异常
    根据自己业务逻辑需要,开发对应类型
    自定义异常类继承Exception
    当出现某种逻辑不满足时抛出
package com.xytx.javaexception.exception;

public class ScoreException extends Exception{
    // 成绩分数异常
    public ScoreException() {
    }

    public ScoreException(String message) {
        super(message);
    }
}

public static char CheckScore(int score) throws ScoreException {
        if(score < 0 || score > 100){
            throw new ScoreException("分数不符合要求"+score);
        }

        if(score >=90 || score <= 100){
            return 'A';
        }
        if(score >=80 || score <= 89){
            return 'B';
        } else {
            return 'C';
        }
    }
public static void main(String[] args) {
        try {
            CheckScore(101);//分数异常
        } catch (ScoreException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值