学习内容:
1、异常:程序运行中遇到的非致命的,通过某种修正后还能将继续执行的错误叫做异常
2、产生异常的几种情况:
(1)Java虚拟机检测到异常,这些异常可能是由以下几种情况引起的
- 表达式的计算违反了Java的语义,如整数被0除
- 超出了某些资源限制,如使用了太多的内存
(2)Java程序代码中的 throw 语句被执行
throw语句用在方法bai体内,表示抛出异常,由方法du体内的语句处理 throws语句用在方法声明后面,表示zhi再抛dao出异常,由调用这个方法的上一级方法中的语句来处理throws主要是声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常。throw是具体向外抛异常的动作,所以它是抛出一个异常实例。throws说明你有哪个可能,倾向 throw的话,那就是你把那个倾向变成真实的了同时:1)throws出现在方法函数头;而throw出现在函数体; 2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常; 3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
(3)异步异常发生,异步异常的原因可能由以下情况引起
- Thread的stop方法被调用
- Java虚拟机内部错误发生
3、异常处理的几个关键字
Java异常处理通过5个关键字来管理:try 、catch、 throw 、throws 、finally
Java中的异常类有一个父类叫做 Throwable ,其下面有两个子类分别是Error类和Exception类
(1)Error异常
Error指的是错误,通常是程序员不可能通过代码来解决的问题,底层环境或者硬件问题,也就是说在程序中用户不用捕获Error及任何Error子类的异常
Error类包括linkageError(结合错误)和 VitualmachineError(虚拟机错误)
(2)Exception
Exception指的是异常,或理解为程序运行过程中出现的意外情况,通常在程序中捕获的异常其实是 Exception及 Exception子类的异常
Exception类型的异常又分为运行时异常和非运行时异常
4、在Java中如何进行异常处理
Java异常处理的方法有两种,分别是使用 try...catch...finally...和throws来操作的
(1)try...catch...finally...
它捕获被命名为属于异常类的异常,并调用方法处理它。其中finally无论有无异常都会执行,finally可以省略
package day01; public class TryCatchFinally { public static void main(String[] args) { try { int x=5; int y=x/0; System.out.println(y); }catch(Exception e) { e.printStackTrace();//将错误打印到堆栈 }finally { System.out.println("Over!"); } } }
catch语句可以有多个,并且如果用户要捕获 Exception ,则将 Exception放到最后,不能放在前面,否则会出错。可以简单理解为,如果要捕获多个异常,异常的范围要按照从小到大顺序叠放
package day01; public class TryCatchFinally { public static void main(String[] args) { try { int x=5; int y=x/0; System.out.println(y); }catch(IllegalArgumentException e) { e.printStackTrace();//将错误打印到堆栈 }catch(Exception e){//Exception的范围比较大,应该放在后面 e.printStackTrace(); } } }
当抛出一个异常时,异常会由相应的catch语句捕获并处理。与一个try相关的catch语句可以有多个,构成多重catch语句,异常类型决定了要执行哪个catch语句,如果没有抛出异常,那么try代码块就会结束,并且会跳过它的所有catch语句,从最后一个catch后面的第一个语句继续执行。
其实try语句也可以嵌入try语句,一个try代码块可以嵌入到另一个try代码块中。由于内部try代码块产生的异常如果没有被与该内部try代码块相关的catch捕获,就会传到外部try代码
例:try语句嵌入多个try语句
package day01; public class TryCatchFinally { public static void main(String[] args) { try{ try { int x=5; int y=x/0; System.out.println(y); }catch(Exception e) { e.printStackTrace(); } }catch(IllegalArgumentException e){ e.printStackTrace();//将错误打印到堆栈 }catch(Exception e) {//Exception的范围比较大,应该放在后面 e.printStackTrace(); } } }
遇到的问题:
IllegalArgumentException是什么?
IllegalArgumentException此异常表明向方法传递了一个不合法或不正确的参数。
try...catch...finally...异常处理方法没明白
https://www.jb51.net/article/154023.htm
明天要学习的内容:
使用throws抛出异常、通过throw 抛出异常、自定义异常、用log4j记录异常日志信息