异常、自定义异常的讲解

一、异常

异常是什么?
程序在运行的过程,出现了一些突发状况,造成程序无法继续运行。

  1. 异常发生的图解过程:
    异常、自定义异常的讲解_第1张图片
    2.异常体系
    异常、自定义异常的讲解_第2张图片
    Java异常处理的五个关键字:try、catch、finally、throw、throws
    java中处理异常的两种方式:
    1)声明异常:
    2)捕获异常:

throw和throws的区别?
throw:抛出异常,用在方法内,用来抛出一个异常对象,将这个异常对象传递到调用者处,并结束当前方法的执行。
throws:声明异常,运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常).

下面是关于异常的一道面试题,具体的解析过程可以debug来看。值得注意的是最后x的值是2,但是输出的是1

public class TryCatchFinallyDemo06 {
    public static void main(String[] args) {
        //调用方法
       int x = show(0);
       System.out.println("x = " + x);//
    }

    private static int show(int n) {
        try {
            //可能发生异常代码
            //判断n
            if(n == 0){
                //抛异常
                throw new Exception("n不能等于0");
            }
            System.out.println("try......");
            n++;
            //返回数据
            return n;
        } catch (Exception e) {
            System.out.println("哈哈抓住你了。。");
            n++;
            return n;//return 的n开辟了一个临时空间
        } finally {
            System.out.println("我是必须执行的");
            n++;
//            return n;
        }
    }
}

运行结果:x=1

二、自定义异常

package HomeWork.Demo08;
/*
请使用代码实现
每一个学生(Student)都有学号,姓名和分数,分数永远不能为负数
如果老师给学生赋值一个负数,抛出一个自定异常
1.创建Student类的javabean
   在有参构造的参数列表后声明一个异常
   在方法体中throw new GradeException("成绩越界异常");
2.创建GradeException类
    写上有参数构造,无参构造,有参构造方法体中写上super(message)
3.在测试类中选中可能出现异常的代码,
ctrl+alt+T生成捕获异常代码
 */
public class Student {
    private String num;//学号
    private String name;//姓名
    private double grade;//姓名
    
    public String getNum() {return num;}
    public void setNum(String num) {this.num = num;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public double getGrade() {return grade;}
    public void setGrade(double grade) {this.grade = grade;}

    public Student(String num, String name, double grade) throws GradeException{
        if(grade<0){
            throw new GradeException("成绩越界异常");
        }
        this.num = num;this.name = name; this.grade = grade;
    }
    public void show(){
        System.out.println(getName()+"的成绩:"+getGrade());
    }
}
public class GradeException extends Throwable {
    public GradeException() {
    }
    public GradeException(String message) {
        super(message);
    }
}
public class Test {
    public static void main(String[] args) {
        try {
            Student s = new Student("001", "labek", -80);
            s.show();
        } catch (GradeException e) {
            e.printStackTrace();
        }
    }
}

你可能感兴趣的:(JavaSE的学习之旅)