Java---异常

Java—异常

所谓的异常,其实就是在程序执行的时候,产生的一种突发情况,进而产生已知或未知的问题。
生活中就像我们开车去上班,突然某一天因为交通事故而造成堵车,使你无法按时到达公司,又或者你的车子半路抛锚,只能叫拖车。这样看,你还挺倒霉的呀,哈哈…

好,我们回到代码中来,看一下下面的这段代码:
在这里插入图片描述
一般情况下是没有问题的吧,可以正常运行,但是我们有没有考虑到分母不能为0的特殊情况,如果没有,就会出现下面这种报错:
在这里插入图片描述
那么我们该如何解决呢?其实,以我们之前学到知识完全可以解决,但是代码臃肿,而且还要花精力去堵漏洞,所以,为了更好的解决这个痛点,我们使用异常处理机制
这就是我们对异常处理的思维步骤:
在这里插入图片描述
在这里插入图片描述
异常处理的基本结构:
1.try-catch
2.try-catch-finally
3.try-finally(用的少)

public void method(){
	try{
		//代码段1
		//代码段2,会产生异常的代码
		//代码段2
	}catch(异常类型 e){
		//代码段4,对异常进行处理的代码段
	}finally{
		//代码段5,不管有没有异常,都会执行的代码段
	}
}

try{}里面放可能产生异常的代码段
catch{}里面放如果发生异常该怎么处理的代码段
finally{}里面放无所谓,无论异常与否都执行
【注意:finally代码块都会执行(除非强行中断例如:exit(-1))
catch块中有return,先执行return在执行finally块】
举个例子

//输入其他数字提示信息,输出非数字,显示异常,输入1~3则输出对应课程
System.out.println("请输入课程编号(1~3):");
        Scanner sc = new Scanner(System.in);
        int a = 0;
        try {
            a = sc.nextInt();
            switch (a){
                case 1:
                    System.out.println("C++");break;
                case 2:
                    System.out.println("Java");break;
                case 3:
                    System.out.println("Python");break;
                default:
                    System.out.println("别瞎输");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("欢迎提出建议");
        }

结果显示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

异常处理的三种情况:
1.正常情况:try正常走完,不会进入catch块,进入finally块,继续向下执行
2.程序发生异常并被捕获:try块走到发生异常的位置,进入catch块,进入finally块,继续向下执行
3.程序发生异常并没有被捕获:try块走到发生异常的位置,进入finally块,继续向下执行

捕获到异常该如何处理呢?就是catch代码块该写什么呢?
1.用户自定义输出提示信息
例如:System.out.println(“被除数不能为0”);
2.e.printStackTrace();
3.e.getMessage();
在这里插入图片描述
常见的异常:
在这里插入图片描述
来个例子:

Scanner sc = new Scanner(System.in);
System.out.println("请输入两个数");
try {
    int a = sc.nextInt();
    int b = sc.nextInt();
    System.out.println(a / b);
}catch (ArithmeticException e){
    //System.out.println(e.getMessage());     //两种处理异常方式,或者自己打印
      e.printStackTrace();
}catch (InputMismatchException e){
    //System.out.println(e.getMessage());
      e.printStackTrace();
}
System.out.println("程序运行结束");

结果显示:
在这里插入图片描述
异常体系的结构:异常的顶层父类是Throwable类,Object是它的父类。Throwable类有两个子类:Error 和 Exception。而Exception又分两大类:CheckedException和RuntimeException。
在这里插入图片描述
但是,当我们不想处理异常的时候怎么办呢?当然是把锅甩给别人拉。将异常抛出。
在这里插入图片描述
在这里插入图片描述
举个例子:

/**
 * @Author shall潇
 * @Date 2021/1/21
 * @Description     抛出异常-对年龄进行输入1~100,正常输出,其他则抛出并处理。
 */
public class User {
  private int age;      //定义年龄

    public int getAge() {
        return age;
    }

    public void setAge(int age)  {
        if(age>100|| age<1){
            throw new RuntimeException("年龄不符合规定");      //抛出异常
        }
        this.age = age;
    }

    public static void main(String[] args)  {
        User user = new User();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年龄");
        try {                                               
            int a = sc.nextInt();
            user.setAge(a);								//处理异常
            System.out.println(user.getAge());
        }catch (Exception e){
            System.out.println("输入不合理");
        }
    }
}

结果显示
在这里插入图片描述
当然我们可以自定义异常类型,首先继承Throwable类、Exception或者RuntimeException,推荐后两个。然后,提示异常信息。
接下来,我们就演示一下,构建自己的异常继承RuntimeException

//自定义年龄异常
public class AgeException extends RuntimeException{
    public AgeException(String message) {
        super(message);
    }
}

public class User {
  private int age;      //定义年龄

    public int getAge() {
        return age;
    }

    public void setAge(int age)  {
        if(age>100|| age<1){
            throw new AgeException("年龄不符合规定");      //抛出异常
        }
        this.age = age;
    }

    public static void main(String[] args)  {
        User user = new User();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年龄");
        try {                                               //处理异常
            int a = sc.nextInt();
            user.setAge(a);
            System.out.println(user.getAge());
        }catch (Exception e){
            System.out.println("输入不对");
        }

    }
}

结果和上面的一样就不截图了。

猜你喜欢

转载自blog.csdn.net/qq_43288259/article/details/112943284