Java—异常

目录

异常体系

异常的作用

异常的处理方式

JVM默认的处理方式

自己处理(捕获异常)

分类讨论异常捕获情况

异常中的常见方法

抛出异常

总结

自定义异常


异常体系

异常是什么?
程序中可能出现的问题

异常体系的最上层父类是谁?异常分为几类?
父类:
Exception
异常分为两类:编译时异常、运行时异常

编译时异常和运行时异常的区别?
编译时异常:
没有继承RuntimeExcpetion的异常,直接继承于Excpetion。在编译阶段就会提示错误;
运行时异常:RuntimeException本身及其子类。编译阶段没有错误提示,运行时才出现错误提示。

代码示例

public static void main(String[] args) {

    //编译时异常(在编译阶段,必须要手动处理,否则代码报错,无法运行)
    String time ="2030年1月1日";
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    Date date = sdf.parse(time);
    System.out.println(date);

    //运行时异常(在编译阶段是不需要处理的,是代码运行时出现的异常)
    int[] arr ={1,2,3,4,5};
    System.out.println(arr[10]);//ArrayIndexOutofBoundsException

}

异常的作用

作用一:通过异常提示可以查询bug的关键参考信息
作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况


异常的处理方式

JVM默认的处理方式

将异常的名称,异常原因及异常出现的位置等信息输出在控制台中,程序停止执行,异常出现位置下面的代码不会再执行。

自己处理(捕获异常)

public static void main(String[] args) {

    int[] arr = {1, 2, 3, 4, 5, 6};
    try {
        System.out.println(arr[10]);
    }catch (ArrayIndexOutOfBoundsException e){
        System.out.println("索引越界了");
    }

    System.out.println("看看我执行了吗?");

}

分类讨论异常捕获情况

1. 如果try中没有遇到问题,怎么执行?
会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。
注意:只有当出现了异常才会执行catch里面的代码 。

2. 如果try中可能会遇到多个问题,怎么执行?
会写多个catch与之对应。
注意:如果我们要捕获多个异常,这些异常中如果存在父子关系的话,那么父类一定要写在下面
了解:在JDK7之后,我们可以在catch中同时捕获多个异常,中间需要用分隔符" | "进行隔开表示,如果出现了A异常或者B异常的话,采取同一种处理方案

3. 如果try中遇到的问题没有被捕获,会怎么执行?
相当于try...catch白写了,当前异常会交给虚拟机处理

4. 如果try中遇到了问题,那么try下面的其他代码还会执行吗?
如果try中遇到了问题,则出现问题处下方的代码不会再执行,会直接跳转到对应的catch当中,执行catch中的语句。如果没有对应catch与之匹配,则会交给虚拟机进行处理


异常中的常见方法

public String getMessage()        //返回此 throwable 的详细消息字符串
public string toString()          //返回此可抛出的简短描述

//把异常的错误信息输出在控制台,同时包含getMessage和toString两个方法的信息,并且只做打印,不会停止代码运行
public void printStackTrace()

代码示例

public static void main(String[] args) {

    int[] arr = {1, 2, 3, 4, 5, 6};
    try {
        System.out.println(arr[10]);
    }catch (ArrayIndexOutOfBoundsException e){

        String message1 = e.getMessage();
        String message2 = e.toString();

        System.out.println(message1);
        System.out.println(message2);
        e.printStackTrace();
    }

    System.out.println("看看我执行了吗?");

}

抛出异常

代码示例 

public static void main(String[] args) {

    int[] arr = new int[0];
    try {
        int sum = getSum(arr);
        System.out.println(sum);
    } catch (NullPointerException e) {
        System.out.println("空指针异常");
    }catch (ArrayIndexOutOfBoundsException e){
        System.out.println("索引越界异常");
    }
}

//运行时异常不需要手动声明
public static int getSum(int[] arr)/*throws NullPointerException,ArrayIndexOutOfBoundsException*/ {
    if (arr == null)
        throw new NullPointerException();
    if (arr.length == 0)
        throw new ArrayIndexOutOfBoundsException();
    
    int sum = 0;
    for (int i = 0; i < arr.length; i++)
        sum += arr[i];
    return sum;
}


总结


自定义异常

意义:为了让控制台的报错信息更加见名之意 

步骤如下
1.定义异常类
2.写继承关系
3.空参构造
4.带参构造

注意
类命名技巧:异常类型+Exception
若该类为运行时异常则需继承:RuntimeException(表示由于参数错误而导致的问题)
若该类为编译时异常则需继承:Exception(提醒程序员检查本地信息)

代码示例如下

//自定义异常类
public class NameFormatException extends RuntimeException {
    //类命名技巧:异常类型+Exception

    //若该类为运行时异常则需继承:RuntimeException(表示由于参数错误而导致的问题)
    //若该类为编译时异常则需继承:Exception(提醒程序员检查本地信息)

    public NameFormatException() {
    }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值