Java异常2

Java异常2

如果try没有遇到问题,怎么执行?

会把try里面所有代码执行完毕,不会执行catch()里面的内容.

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[0]);
            System.out.println(2 / 1);


        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

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

如果try遇到多个问题,怎么执行?

我们要写多个catch与其对应

也就是说在try里面如果发生异常,下面的代码就会被打断,然后执行对应的catch操作,(catch运行完这个语句就结束了)如果我们没有进行这个对应的catch操作,JDK就会自己默认处理.

import java.net.PortUnreachableException;

public class Main6 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[100]);
            System.out.println(2 / 0);
            String s = null;
            System.out.println(s.equals("abc"));
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        } catch (ArithmeticException e) {
            System.out.println("不能除以0");
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        }
        System.out.println("看看我执行了吗!!");
    }
}

细节:

如果我们要捕获多个异常,这些异常存在父子关系的话,那么父类一定要写在下面.

image-20230629201051805

在JDK7之后,我们可以在catch中捕获多个异常,中间使用|来进行隔开,表示如果出现了A异常或者B异常的话,采用同一种处理方案.

如果try中遇到的异常没有被捕获?

相当于try...catch代码没起作用,最后还是采用虚拟机默认进行处理.

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(2 / 0);


        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

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

如果try中遇到了问题,try下面的代码还会执行吗?

下面的代码就不会执行了,直接跳转到对应的catch当中,执行catch里面的语句体,但是如果没有对应的catch与其匹配,那么还是会交给虚拟机默认处理.

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[100]);
            System.out.println("你好,嘿嘿嘿,看看我执行了吗!!");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

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

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(2/0);
            System.out.println("你好,嘿嘿嘿,看看我执行了吗!!");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

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

image-20230629203150575

异常中的常见方法

Throwable 的成员方法

image-20230629203412759

按CRTL+L+T可以快速生成异常处理

其中 public void printfStackTrace() 比较常用.细节:仅仅是打印信息,不会停止虚拟机.(以红色字体进行打印.包含的信息最多.)

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[100]);
        } catch (ArrayIndexOutOfBoundsException e) {
            String str = e.getMessage();//返回详细的字符串信息
            System.out.println(str);
            String s = e.toString();//返回简短的字符串信息
            System.out.println(s);


        }

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

public class Main7 {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6};
        try {
            System.out.println(arr[100]);
        } catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();//把错误信息输出到控制台
        }
        System.out.println("看看我执行了吗!!");
    }
}

image-20230629204508128

错误输出:信息为红色,可能不符合程序的从上向下运行.

image-20230629204209903

抛出异常

image-20230629205411563

手动创建一个异常对象,并且把这个异常交给方法的调用者处理

此时方法就会结束,下面的代码就不会执行了.

就是自己在方法内进行异常处理,并且抛出,并且返回到调用处.

import java.util.Random;

public class Main4 {
    public static void main(String[] args) {
//        int a[] = {1, 2, 3, 4, 5, 6};
        int a[] = null;
//      int a[]={};
        int ans = 0;
        try {
            ans = getmax(a);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        } catch (NullPointerException e) {
            System.out.println("空指针异常");
        }
        System.out.println(ans);
        //但是这个方法可能会出现异常.
    }

    public static int getmax(int[] arr)/* throws NullPointerException,ArrayIndexOutOfBoundsException*/ {//运行时异常throws可以不写
        if (arr == null) {
            throw new NullPointerException();
        }
        if (arr.length == 0) {
            throw new ArrayIndexOutOfBoundsException();

        }
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;
    }
}

小结

image-20230629210952057

综合练习

抛出:写在方法里面

捕获:写在方法的调用处

image-20230630093711973

Girlfriend类

public class Girlfriend {
    private String name;
    private int age;

    public Girlfriend() {
    }

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

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {

        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) throws RuntimeException {

        if (name.length() < 3 || name.length() > 10) {
            throw new RuntimeException();//名字长度不正确抛出运行时异常
        }
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age)throws RuntimeException{
        if (age<18||age>40)
        {
            throw new RuntimeException();//年龄不正确抛出运行时异常
        }
        this.age = age;
    }

    public String toString() {
        return "Girlfriend{name = " + name + ", age = " + age + "}";
    }
}

Main方法

import java.util.Scanner;

public class Demo01 {
    public static void main(String[] args) {

        Girlfriend one = new Girlfriend();
        String name;
        String ageStr;
        Scanner sc = new Scanner(System.in);


        while (true) {
            try {
                System.out.println("请输入您女朋友的姓名:");
                name = sc.nextLine();
                one.setName(name);//可能出现姓名小于3个字符或者姓名大于10个字符的异常
                System.out.println("请输入您女朋友的年龄");
                ageStr = sc.nextLine();
                int age = Integer.parseInt(ageStr);//可能出现String不是数字的异常
                one.setAge(age);//可能出现age不在18-40数之间的异常
                //运行的这里直接跳出循环
                break;
            } catch (NumberFormatException e) {
                System.out.println("年龄的输入有误,请输入数字!!");
                //继续下一轮循环
                continue;
            } catch (RuntimeException e) {
                System.out.println("姓名的长度或者年龄的范围有误请检查!!!");
                continue;
            }
        }


        System.out.println(one);
    }
}

自定义异常

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

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

image-20230630102319342

image-20230630102647400

AgeOutOfBoundsException

package demo01;

public class AgeOutOfBoundsException extends RuntimeException{
    public AgeOutOfBoundsException() {
    }

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

NameFormatExcepton

package demo01;

public class NameFormatExcepton extends RuntimeException{
    public NameFormatExcepton() {
    }

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

女朋友类

package demo01;

public class Girlfriend {
    private String name;
    private int age;

    public Girlfriend() {
    }

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

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {

        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name){

        if (name.length() < 3 || name.length() > 10) {
            throw new NameFormatExcepton(name+"姓名长度有误请输入长度为3-10的名字");//名字长度不正确抛出相应的异常
        }
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age){
        if (age<18||age>40)
        {
            throw new AgeOutOfBoundsException(age+"年龄超出范围");//年龄不正确抛出运行时异常
        }
        this.age = age;
    }

    public String toString() {
        return "Girlfriend{name = " + name + ", age = " + age + "}";
    }
}

测试类

package demo01;

import java.util.Scanner;

public class Demo02 {
    public static void main(String[] args) {

        Girlfriend one = new Girlfriend();
        String name;
        String ageStr;
        Scanner sc = new Scanner(System.in);


        while (true) {
            try {
                System.out.println("请输入您女朋友的姓名:");
                name = sc.nextLine();
                one.setName(name);//可能出现姓名小于3个字符或者姓名大于10个字符的异常
                System.out.println("请输入您女朋友的年龄");
                ageStr = sc.nextLine();
                int age = Integer.parseInt(ageStr);//可能出现String不是数字的异常
                one.setAge(age);//可能出现age不在18-40数之间的异常
                //运行的这里直接跳出循环
                break;
            } catch (NumberFormatException e) {
                e.printStackTrace();
                //继续下一轮循环
                continue;
            } catch (AgeOutOfBoundsException e) {
                e.printStackTrace();
                continue;
            }
            catch (NameFormatExcepton e)
            {
                e.printStackTrace();
                continue;

            }


    }


        System.out.println(one);
}
}

posted @ 2023-06-29 21:25  harper886  阅读(10)  评论(0编辑  收藏  举报