Java学习之异常

异常

exception

一般需要程序员管理的异常可以分为两类:
Exception(大类): Runnable异常及其子类 其他异常

  • 运行时异常:RuntimeException及其子类,编译时不会出现异常,运行时才会报错,比如数组索引越界

  • 编译时异常:编译时就会出现的异常,比如日期解析异常

    ## 异常的作用
    
  1. 查询bug的相应信息
  2. 异常可以作为方法中的特殊返回值,以便调用者知道代码底层的情况(可以选择打印信息到控制台,也可以转入1)

异常的处理方式

  • JVM处理异常的方式:打印异常的名称与内容至控制台,停止执行之后的代码
  • 自己处理
/**
 * 捕获异常 格式
 * try{
 *     可能出现异常的代码
 * }catch(异常类 变量名){
 *     出现异常的处理方法
 * }
 * try可以与多个catch搭配,catch中也可以写多个异常,用或者符号隔开。
 * 捕获多种异常,如果异常中存在父子关系,父类一定要写在下面
 * try中若出现异常,那try下面的代码不会执行
 */
public class WebDownload {
    public static void main(String[] args) {
        int[] arry = {1,2,3,4};
        try {
            System.out.println(arry[5]);
        }catch (ArrayIndexOutOfBoundsException e){ //数组索引异常类名
            System.out.println("数组索引不存在");
        }
    }
}

关于抛出异常,捕获异常的选择

Mac上异常快捷键

command+option+T;

小案例

public class ExcepterTest {

    public static void main(String[] args){
        GrilFriend grilFriend = new GrilFriend();
        Scanner sc = new Scanner(System.in);
      //这里使用捕获异常,不让程序停止
        while (true) {
            try {
                grilFriend.setName(sc.next());
                grilFriend.setAge(sc.nextInt());
                break;
            } catch (RuntimeException e) {
                System.out.println("输入格式有误,请重新输入!");
            }
        }
        System.out.println("grilFriend:"+grilFriend.getName()+" "+grilFriend.getAge());
        System.out.println("结束");
    }
}



class GrilFriend{
    private String name;
    private int age;

    public GrilFriend() {
    }

    public GrilFriend(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //这里可以使用抛出异常,如果输入不合法,则不能进行赋值
        if(name.length()<3||name.length()>10){
            throw new RuntimeException();
        }
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if(age < 18 || age > 40){
            throw new RuntimeException();
        }
        this.age = age;
    }
}

自定义异常

/**
 * 这是一个自定义异常类
 * 命名格式:异常名+Exception
 * 运行时异常继承Runnable类:表示由于参数错误而导致的问题
 * 编译时继承Exception类:提醒程序员检查本地信息
 */
public class NameFormationExcepter extends RuntimeException{
    //创建空参构造和有参构造方便调用
    public NameFormationExcepter() {
    }

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

public void setName(String name) {
        //这里可以使用抛出异常,如果输入不合法,则不能进行赋值
//        if(name.length()<3||name.length()>10){
//            throw new RuntimeException();
//        }

        //使用异常类
        if(name.length()<3||name.length()>10){
            throw new NameFormationExcepter(name + "这个姓名不符合格式要求");
        }
        this.name = name;
    }

public static void main(String[] args){
        GrilFriend grilFriend = new GrilFriend();
        Scanner sc = new Scanner(System.in);
        while (true) {
            try {
                grilFriend.setName(sc.next());
                grilFriend.setAge(sc.nextInt());
                break;
            }catch (NameFormationExcepter n){
                n.printStackTrace();
            }
            catch (RuntimeException e) {   //父类异常放在下面
                System.out.println("输入格式有误,请重新输入!");
            }
        }
        System.out.println("grilFriend:"+grilFriend.getName()+" "+grilFriend.getAge());
        System.out.println("结束");
    }
posted @ 2023-02-24 18:59  安静的美美  阅读(18)  评论(0编辑  收藏  举报