对java异常的理解

Posted 拿着菜刀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对java异常的理解相关的知识,希望对你有一定的参考价值。

针对java的Excetion(异常)不是很理解。今天就来研究下。

系统异常继承图引用于(https://www.cnblogs.com/fwnboke/p/8529469.html):

 


对异常的疑问:
1、异常是什么?
2、如何使用异常?
3、throws和try-catch-finally如何处理和捕获异常的?
4、讨论下异常使用的场景?

问题解答:
1、异常是什么?
答:首先异常也是类。只是java规定所有异常必须继承Excetion或Excetion的子类,否则自定义的类不能称作为异常类。原因,只有继承Excetion或Exc的子类的类才能捕获到异常发生的位置。不要问为什么,java提供的机制就是如此。

package excetion;

/**
 * @Author : admin
 * @Title : 类型异常
 * @Time : 2020/07/17 10:42
 * @Document :
 */
public class ParamTypeExcetion extends Exception {
    private static final long serialVersionUID = -6143714805279938261L;
    public ParamTypeExcetion(){
        super();
    }

    public ParamTypeExcetion(String s){
        super(s);
    }
}

 

 

 

2、如何使用异常?
答:使用关键字throw和new使用异常。throw关键字的作用从异常发生位置抛出异常,我理解为从异常发生位置停止执行代码,至到跳出异常代码块后继续执行代码。new关键字就是声明一个对象,最基础的关键字了。告诉系统这里出现了一个异常,然后系统告诉对应的异常类你要有消息反馈出来让开发者知道这里有问题。

package excetion;

/**
 * @Author : admin
 * @Title : 年级
 * @Time : 2020/07/17 10:43
 * @Document :
 */
public class GradeClass {
    private String name;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) throws ParamTypeExcetion {
        if(type=="@"){
            throw new  ParamTypeExcetion("类型参数值错误,错误值为"+type);
        }
        this.type = type;
    }
}

 

3、throws和try-catch-finally如何处理和捕获异常的?
答:throws作用域方法,方法内出现异常整个方法都跳出执行过程;try-catch-finally作用域代码块,代码块内出现异常会继续执行代码块以外的代码,try负责捕获异常,catch处理异常。

throws方法使用:

package excetion;

/**
 * @Author : admin
 * @Title :
 * @Time : 2020/07/17 10:51
 * @Document :
 */
public class excetionMain {
    public static void main(String args[]) throws ParamTypeExcetion{
//        try {
//            GradeClass gradeClass = new GradeClass();
//            gradeClass.setType("@");
//        }catch (ParamTypeExcetion e){
//            e.printStackTrace();
//        }
        GradeClass gradeClass = new GradeClass();
        gradeClass.setType("@");
        System.out.println(11);
    }
}

执行结果:

Exception in thread "main" excetion.ParamTypeExcetion: 类型参数值错误,错误值为@
at excetion.GradeClass.setType(GradeClass.java:27)
at excetion.excetionMain.main(excetionMain.java:18)

 

try-catch方法使用:

package excetion;

/**
 * @Author : admin
 * @Title :
 * @Time : 2020/07/17 10:51
 * @Document :
 */
public class excetionMain {
    public static void main(String args[]) {
        try {
            GradeClass gradeClass = new GradeClass();
            gradeClass.setType("@");
        }catch (ParamTypeExcetion e){
            e.printStackTrace();
        }

        System.out.println(11);
    }
}

执行结果:

excetion.ParamTypeExcetion: 类型参数值错误,错误值为@
at excetion.GradeClass.setType(GradeClass.java:27)
at excetion.excetionMain.main(excetionMain.java:13)
11

 


4、讨论下异常使用的场景?
答:常规异常java已经提供,且对应的jar包也提供了自己的异常,我们需要自定义异常的场景大多数是在自开发系统中对业务逻辑和黑客攻击作防御使用。例如:xxs攻击针对系统所有入参作过滤写一个异常类;针对用户提交非法的字符信息写异常类;办理业务是必须先办理A才可以办理B的业务验证作异常处理等这些场景都可以使用异常处理。

以上是关于对java异常的理解的主要内容,如果未能解决你的问题,请参考以下文章

如何理解这段代码片段中的两对括号?

对Java方法方法重载的理解

对java异常的理解

理解Java异常处理机制的机理

java 反射代码片段

Java 检查异常(checked exception)和未检查异常(unchecked exception)区别理解