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()异常。