java异常处理 Exception、error、运行时异常和一般异常有何异同「建议收藏」

java异常处理 Exception、error、运行时异常和一般异常有何异同「建议收藏」一、开场白对于程序运行过程中的可能出现异常情况,java语言使用一种称为异常处理的错误捕捉机制进行处理。相信大家对try{}catch(){}finally{}这种结构非常熟悉,使用频率极高。既然经常使用它,而且也是面试常问知识点,我们就有必要去深入地了解一下。也谈不上深入,只是java语言的基本功。下面,开始吧!二、异常分类在java中,异常对象都是派生于Throwabl…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

一、开场白

对于程序运行过程中的可能出现异常情况,java语言使用一种称为异常处理的错误捕捉机制进行处理。相信大家对 try { }catch( ){} finally{} 这种结构非常熟悉,使用频率极高。既然经常使用它,而且也是面试常问知识点,我们就有必要去深入地了解一下。也谈不上深入,只是java语言的基本功。下面,开始吧!

二、异常分类

在java中,异常对象都是派生于Throwable类的一个实例。如果java内置的异常类不能够满足需求,用户还可以创建自己的异常类。

下图是java异常类层次结构图
这里写图片描述
可以看出,所有的异常都是由Throwable类,下一层分解为两个分支:ErrorExceprion
Error层次结构描述了java运行时系统的内部错误和资源耗尽错误。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。应用程序不应该抛出这种类型的对象。
Exceprion这个层次结构又分解为连个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有没有问题,但由于像I/O错误这类异常导致的异常属于其他异常。
常见的RuntimeException(运行时异常):
IndexOutOfBoundsException(下标越界异常)
NullPointerException(空指针异常)
NumberFormatException (String转换为指定的数字类型异常)
ArithmeticException -(算术运算异常 如除数为0)
ArrayStoreException – (向数组中存放与声明类型不兼容对象异常)
SecurityException -(安全异常)
IOException(其他异常)
FileNotFoundException(文件未找到异常。)
IOException(操作输入流和输出流时可能出现的异常。)
EOFException (文件已结束异常)

三、概念理解

首先明白下面的两个概念
unchecked exception(非检查异常):包括运行时异常(RuntimeException)和派生于Error类的异常。对于运行时异常,java编译器不要求必须进行异常捕获处理或者抛出声明,由程序员自行决定。
checked exception(检查异常,编译异常,必须要处理的异常)
也:称非运行时异常(运行时异常以外的异常就是非运行时异常),java编译器强制程序员必须进行捕获处理,比如常见的IOExeption和SQLException。对于非运行时异常如果不进行捕获或者抛出声明处理,编译都不会通过。
##四、异常的处理 ##
(1)、抛出异常

1、调用一个抛出受查异常的方法必须用throws 子句声明 调用method2()方法。
2、程序运行过程中发现错误,并且利用throw抛出一个受查异常 下面method2()方法。

    @Test
    public void test() throws FileNotFoundException {

        method();
    }
    public void method() throws FileNotFoundException {
        //一个会抛出异常的方法
        method2();
    }

    //这里 方法后是throws 
    public void method2() throws FileNotFoundException {
        //这里是throw 
        throw new FileNotFoundException();
    }

**(2)、捕获异常 **
try { }catch( ){} finally{} 语句块这就比较常见了。不在赘述。
不过下面有一道有意思的题,实际使用中不太会遇见,面试题常见。
来,看题!

       @Test
    public void test()  {

       System.out.println(test11());
    }


    public  String test11() {
        try {
            System.out.println("try block");

            return test12();
        } finally {
            System.out.println("finally block");
        }
    }

    public static String test12() {
        System.out.println("return statement");

        return "after return";
    }

答案:
try block
return statement
finally block
after return

    @Test
    public void test()  {

       System.out.println(test2());
    }


    public  int test() {
        int b = 20;

        try {
            System.out.println("try block");

            return b += 80;
        } catch (Exception e) {

            System.out.println("catch block");
        } finally {

            System.out.println("finally block");

            if (b > 25) {
                System.out.println("b>25, b = " + b);
            }

            return 200;
        }
    }

答案:
try block
finally block
b>25, b = 100
200

总结:finally块的语句在try或catch中的return语句执行之后返回之前执行且finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,若finally里也有return语句则覆盖try或catch中的return语句直接返回。

##五、实际开发中常用的一个模式

###(1)、定义业务中出现的异常
分别是邮箱未注册异常,验证用户信息异常和验证密码异常
这里写图片描述
1、自定义检查性异常类 (EmailNotRegisterException)

public class EmailNotRegisterException extends Exception {
    public EmailNotRegisterException() {
    }

    public EmailNotRegisterException(String msg) {
        super(msg); // msg : 异常提示信息
    }

    public EmailNotRegisterException(Throwable throwable) {
        super(throwable);// throwable 类型
    }
}

2、自定义运行时异常类(MyRuntimeException)

public class MyRuntimeException extends RuntimeException {

public MyRuntimeException() { } // 无参构造

public MyRuntimeException(String msg) { 
    super(msg); // msg : 异常提示信息
}

public MyRuntimeException(Throwable throwable) { 
    super(throwable);// throwable 类型
}
}

###(2)、模拟业务点会抛出这些异常,写一个UserService

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    public User getUserByUserId(int userId) throws EmailNotRegisterException, InvalidPasswordException, InvalidLoginInfoException {
        if(userId==0) throw new EmailNotRegisterException("邮箱没有注册");
        if(userId==-1) throw new InvalidLoginInfoException("账号不存在");
        if(userId==-2) throw new InvalidPasswordException("密码错误");
        return userRepository.findUserByUserId(userId);
    }
}

###(3)在Controller层捕获处理这些异常

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping(method = RequestMethod.GET)
    public ResponseEntity getUser() {
        User user= null;
        try {
            user = userService.getUserByUserId(1);
        } catch (EmailNotRegisterException e) {
            //TODO 做邮箱未注册的处理
            ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
        } catch (InvalidPasswordException e) {
            //TODO 做验证密码失败的处理
            ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
        } catch (InvalidLoginInfoException e) {
            //TODO 做验证账号失败的处理
            ResponseEntity.status(HttpStatus.FORBIDDEN).body(e.getMessage());
        }
        return  ResponseEntity.ok().body(user);
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/188831.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WebLogic的下载与安装

    WebLogic的下载与安装一、WebLogic的介绍WebLogic是美国bea公司出品的一个applicationserver,确切的说是一个基于Javaee架构的中间件,纯java开发的,最新版本WebLogicSe

    2022年7月1日
    29
  • pycharm编写的文件如何执行_pycharm可以写java吗

    pycharm编写的文件如何执行_pycharm可以写java吗最近在做编译原理课设,准备用Java写个GUI整合一下,因为自己的LL1文法使用python写的,所以需要Java来实现运行python代码,网上给出了主要三种方法,但是使用Jython的方法有局限性且不太方便,于是我将采用最简洁的方法Runtime.getRuntime()运行python代码,下面给出代码Processproc;try{/*注意:这里这种方式和cmd中使用python+文…

    2022年8月27日
    0
  • 用于安装python第三方库的工具是_Python第三方库安装

    用于安装python第三方库的工具是_Python第三方库安装Python 有一个全球社区 在这里 我们可以搜索 Python 第三方库的任何话题 PyPI 的全称是 Python 包指数指 Python 包的指数 它是由 PSF Python 软件基金会 和显示全球 Python 计算生态系统 我们需要学会使用 PyPI 的主要网站 搜索和发现我们使用第三方 Python 库和关心 例如 如果您正在开发一个 blockchain related 程序 您需要使用 Python 的计算生态三个步

    2025年7月3日
    1
  • linux文件重命名rename「建议收藏」

    linux文件重命名rename「建议收藏」linux下rename提供了有效的方法来处理重命名1.修改后缀名(eg.将当前目录下以.log为后缀的文件为以.txt为后缀)rename.log.txt*.logorrename’s/.log$/.txt/’*.log2.删除后缀名(eg.将当前目录下.txt文件的后缀)rename’s/.txt$//’*.txt3.添加后缀名(eg.给当前目录下的

    2022年9月10日
    0
  • java 调用asmx[通俗易懂]

    java 调用asmx[通俗易懂]packagecom.webservice.test;importjava.util.Vector;importjavax.xml.namespace.QName;importjavax.xml.rpc.ParameterMode;importjavax.xml.rpc.encoding.XMLType;importorg.apache.axis.clien

    2022年6月9日
    38
  • mysql学习—查询数据库中特定的值对应的表

    遇到一个问题,我将问题抽象简单描述如下: 循环查询数据库所有表,查出字段中包含tes值的表,并且将test修改为hello? 因为自己不才找了很久也没有找到很好的方法,又对mysql的游标等用法不是很了解,在时间有限的情况下,发现了下面的方法,分享给大家:

    2022年2月25日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号