java中的异常Exception的划分,以及他们的特性。

1、异常分为编译时异常(ExceptionSubclass)和运行时异常(RuntimeException):

2、编译时异常的发生概率高,而运行时异常的发生概率比较低,因此编译时在编写代码时应该处理,而运行时异常可以在编写代码时不处理,系统会自动对其进行处理。所有的异常都是发生在运行期。

java语言对异常处理的两种方式:1、在方法声明时使用throw关键字,抛给上一级。

                                                      2、使用try........catch语句进行异常的捕捉。

这里的异常是ArithmeticException,被底层默认抛给上一层,然后抛给了JVM,导致程序被终止了。

3、如何使用throws进行异常的处理:

以下代码为什么会报错?因为dosome()方法throws了ClassNotFoundException异常,而ClassNotFoundException异常是编译时异常的子类,因此必须在代码阶段进行处理。但是在方法调用的时候没有编写代码进行处理,如果没有处理,那么编译器报错。

4、如何使用try......................catch捕捉异常

当每一方法遇到异常时有两种选择:第一种在程序声明时加一个throws异常,将异常返回给上一级调用方法,

                                                          如果异常逐级上抛到JVM都没有得到解决,那么程序将会被JVM强行

                                                           终止运行的

                                                           第二种在程序体中加入try................catch语句将要调用的函数

                                                             放入try语句内,这样就可以将将异常解决。

5、注意手动在程序中抛异常时,关键字是throw而不是throws。手动抛异常得语法格式是:throw new 异常名("想要告诉使用者的字符串");而且抛异常的时候可以一次抛出多个异常。一个方法在调用的时候出现异常,那么这个方法后面的程序就不再会执行。

注意:什么时候用throws什么时候用try.................catch?

6、深入try..............catch

                     当调用程序时,如果某个方法出现异常,那么这个方法后面的程序就不会再执行,而如果这个方法的异常被catch后,这个方法后面的程序就可以继续执行。

                    1、catch后面的小括号中的类型可以是具体的异常类型,也可以是该异常类型的父类型

                    2、catch可以写多个,建议catch的时候,精确地一个一个处理,这样有利于程序的调试

                    3、catch可以写多个时候,必须遵守从上到下,且从小到大,也就是子类在上,父类在下,否则会报错。(下图的方法会报错,因为不是从上到下的)

注意:jdk8以后可以将几个异常的捕捉合起来写成|分割的形式。

7、在异常处理中两个比较重要的方法:

        1、获取异常的简单的描述信息:

               String mes=exception.getmessage();其中exception是异常的名字。输出的东西就是异常

               在创建时输入的字符串。

        2、打印异常追踪的堆栈信息:

               exception.printStackTrace();其中exception是异常的名字。输出的东西是出现异常的具体位置。

输出的结果:

8、如何通过程序的异常信息来判断程序哪里出的错

9、finally子句

             1、作用是即使try中间出现异常,也能保证finally子句中的程序继续执行,这样就保证了一些必须要执行的成序必须要执行。

                  2、 那么什么时候使用finally呢?

      下图中当出现空指针异常时,异常被捕捉,导致直接执行catch(NullPointerException e),然后执行后面的语句,导致fis.close()语句没有被执行。这样就导致程序出现了问题。此时finally能够很好的解决问题。

        3、 如下图就是加入finally的代码,这样就保证了fis.close()的运行,这样整个程序就可以正常运行了。

从这里我们可以看出:finally子句一般用于资源的释放和关闭

                                     finally中的代码比较有保障

                                      即使try语句出现异常,finally中的代码也可以顺利执行。

10、try和finally联用没有catch的情况

         没有catch程序还是会执行,只是try执行时,会先跳过return然后执行finally中的语句,执行完以后再执行return语句。也就是说放在finally语句中的代码是一定会执行的。

只有一种情况可以阻止finally中的语句执行,那就是退出jvm语句System.exit(0);。


注意一种特殊的情况:

下图的return i的返回值是100而不是101,具体原因注释已经解释了。但是可以看一下下一张图的反编译的代码就能明白了。

反编译的结果:

11、final、finally、finalize有什么区别?

12、如何定义一个异常:

13、重写之后的异常,只能比重写之前的异常抛出的异常更少,范围更小,但是有一个异常要注意,就是RunTimeException()这个异常即使重写前没抛出异常,重写后也可以抛出RunTimeException()异常。


版权声明:本文为qq_35677589原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。