zoukankan      html  css  js  c++  java
  • java中的异常体系?throw和throws的区别?

    一、java中的异常体系

       Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,  这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。

    1、Error与Exception
        Error是程序无法处理的错误,它是由JVM产生和抛出的,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。
    Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
    2、运行时异常和非运行时异常
        运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
        非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

    3.throw与throws

       throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。

      throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出.

    二、异常总结

      首要条件还是那句话,如果不能解决到出现异常的情况,那就不要捕获它,更不要吞掉他。

      当然有的时候你会打算记录异常的日志,但是最开始也说过,异常也代表一个消息,就像IndexOutOfBoundsException、IOException本身的名字已经可以表明异常的大部分信息,也就是说通过异常堆栈基本就能得到关于异常部分的信息,但是有些异常堆栈没有的是什么呢,那就是发生异常条件时的外部信息。

      当然在抛出异常的时候,虚拟机本身会尽可能的打印出直接导致异常产生的输入,可是当我们还想获取额外的环境信息的时候,我们就需要捕获异常,然后打印出来。

      就像简单的除0异常,以及字符串转数字异常,本身异常堆栈就会提供基本的信息,但是如果我们在一个用户交互的环境下,假如我们想要知道是哪个用户的输入导致了异常的产生,这个时候系统产生的异常堆栈信息就不能满足我们的要求了,而这个信息在当前类的一个字段中,这时候我们就要主动捕获然后打印出我们想要的。

    参考链接:Java异常体系简析

           java异常体系结构详解

  • 相关阅读:
    day 30 粘包 自定义报头
    day29 网络基础之网络协议和通信
    day28 面向对象的进阶 反射 和类的内置方法
    day 27 模块和包 面向对象的复习
    CGI,FastCGI,PHP-CGI和PHP-FPM的区别
    跨平台的移动应用开发引擎CrossApp简介
    element-ui组件中的select等的change事件中传递自定义参数
    关于setInterval和setTImeout中的this指向问题
    懒加载和预加载的区别
    vueX的五个核心属性
  • 原文地址:https://www.cnblogs.com/jxxblogs/p/12091948.html
Copyright © 2011-2022 走看看