你知道throw和throws的区别吗?

本文使用junit单元测试,如果不知道请学习junit单元测试

1.Error:

  1. java虚拟机无法解决的严重问题
  2. 例:jvm系统内部错误,资源耗尽等

2.Exception --常见异常

image-20201110171135202

在这里插入图片描述

面试题?:常见的异常都有哪些,举例说明!

package com.fyp.servlet2;

import org.junit.jupiter.api.Test;

import java.util.Date;

public class ExceptionTEST {


    @Test
    public void test(){
        //空指针异常
//        int[] arr = null;
//        System.out.println(arr[3]);
        //数组索引越界
//        int[] arr = new int[10];
//        System.out.println(arr[9]);
        //字符串脚标越界
//        String str = "abc";
//        System.out.println(str.charAt(3));
    }
    @Test
    public void test1(){
        //类型转换异常
//        Object obj = new Date();
//        String str = (String)obj;
        //NumberFormatException
        // String 类型转化int类型的时候,文本不能有其他字符
//
    }
}

3.异常处理机制

异常处理,抓抛模型

一:“抛”,程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。

  • 一旦抛出对象以后,其后的代码就不再执行

二:“抓”,异常处理的方式:1.try-catch-finally 2.throws

​ 1.try-catch-finally的使用:

  • try{
        //可能出现异常的代码
    }
    catch (异常类型1 变量名1){
        //处理异常的方式1
    }catch (异常类型2 变量名2){
        //处理异常的方式2
    }
    finally{
        //一定会执行的代码
    }
    
  • finall ,是可选择性的写的,不一定非要写

  • try把可能出现的异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据此对象的类型,去catch中进行匹配

  • 一旦try中的异常对象匹配到某一个catch时,就进入catch异常处理,一旦处理完成就会跳出当前的try-catch结构(没有写finally的情况)。继续执行结构后面的代码

  • catch中的异常类型如果没有父子类关系,那么声明的顺序无关,如果有父子类关系,则要求子类一定在父类上面声明

  • 常用的异常处理的方方式

    • String getMessage()
    • printStackTrace() 返回异常出现的地方-包含上一个
  • 在try结构中声明的变量,出了try结构以后,就不能被调用。如果把变量声明到结构外部,就不会出现这个问题了

  • 是可以选的,可以写也可以不写

  • finally中声明的是一定会被执行的代码,即使catch中又出现异常了,try中或者catch中有return语句,也不会影响finally代码的执行

  • 像一些数据库连接,和输入输出流,网络编程scoket等资源,jvm不可以自当的回收,所以我们需要自己手动的进行资源的释放,这些操作就得是声明在finally中保证一定被执行

异常处理方式二:throws + 异常类型

  • 写在方法声明处,指明此方法执行的时候,可能会抛出的异常类型

    一旦方法体执行的时候,出现异常,任然会在异常代码处生成一个异常类的对象,此对象满足throws后面的异常类型的时候,就会被抛出。异常代码后面的代码则不再执行了

  • try-catch-finally:真的把异常给处理掉了

  • throws :只是把异常抛出了,抛给了方法的调用者。并没有真正的处理异常

    重写方法异常抛出的规则:

  • ​ 子类重写的方法抛出的异常类型,不大于父类被重写方法抛出的异常类型

    开发中如何选择使用try-catch-finally 还是使用throws?

  • 如果父类中被重写的方法没有使用throws抛出异常,则子类重写的方法不能使用throws抛出异常,如果有异常,只能使用try-catch-finally方法进行处理

  • 如果执行方法a中调用了b,c,d,e,f几个方法,建议这几个方法可以使用throws都交给a进行处理异常

throw关键字

  • 关于异常对象的产生:

    • 系统自动生成的异常对象
    • 手动的生成一个异常对象,使用throw
  • package com.fyp.servlet2;
    
    public class throw_test {
        public static void main(String[] args) {
            try {
                Student s = new Student();
                s.regist(-100);
                System.out.println(s);
            }catch (RuntimeException e){
                System.out.println(e.getMessage());
            }
    
        }
    }
    
    class Student{
        private int id;
        public void regist(int id){
            if (id>0){
                this.id=id;
            }else{
                throw new RuntimeException("输入的数据有误!");
            }
        }
    
        @Override
        public String toString() {
            return "id等于"+id;
        }
    }
    
       throw new RuntimeException("输入的数据有误!");
        }
    }
    
    @Override
    public String toString() {
        return "id等于"+id;
    }
    

    }

面试题:throw和throws的区别?
大家可以在评论区回复

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fan_Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值