异常
1、异常概述
-
1.什么是异常?Java提供异常机制有什么用?
- 程序执行过程发生了不正常的情况,而这种不正常的情况叫做:异常。
- java语言是很完善的语言,提供了异常的处理方式,以下程序出现了不正常情况,java把该信息打印输出控制台,供程序员参考。程序员看到异常信息后,可对程序进行修改,让程序更加健壮。
-
2.异常信息是由jvm打印的。
2、java语言中异常存在形式
-
1.java语言中异常以什么形式存在呢?
- 异常在java中以类的形式存在。每一个异常类可以创建异常对象。
- 并且jvm将new的异常对象抛出,打印输出在控制台。
- 以类和对象的形式存在。
-
2.异常对应对应现实生活是怎样的?
-
如:丢鸡(异常类):
- 张三家鸡被偷了
- 李四家鸡被偷了
-
类:模板 对象:实际存在的个体。
-
3、异常的继承结构
-
1.使用UML图描述继承结构。什么是UML?有什么用?
-
-
UML是一种统一建模语言。只要是***面向对象***的编程语言,都有UML。
-
UML可以描述类与类之间的关系,程序的执行流程,对象的状态等。
-
相当于设计图,在java软件开发中,设计师负责设计类,软件开发人员必须要看懂。
-
UML有很多绘图工具:
-
-
Rational Rose starUML等
-
Obeject下有 Throwable (可抛出的)
-
Throwable下有两个分支:Error和Exception
-
Exception有两个分支:
-
Exception的直接子类:编译时异常(又被叫做受检异常、受控异常)
CheckedException
-
RuntimeException:运行时异常(未受检异常、非受控异常)
UnCheckedException
-
注意:所有异常都在运行阶段。
-
-
-
-
2.编译时异常和运行时异常,都是发生在运行阶段。编译阶段异常是不会发生的。
-
-
编译时异常因什么而得名?
-
因为编译时异常必须发生在编译(编写)阶段预处理,如果不处理编译器会报错。因此得名,所有异常都是发生在运行阶段的。因为只有程序运行阶段才可以new对象。因为异常的发生就是new异常对象。
-
-
3.编译时异常和运行时异常的区别?
- 编译时异常一般发生概率高
- 运行时异常一般发生概率低
- 假设没有对异常进行划分,没有分为:编译时异常和运行时异常。所有的异常都必须在编写阶段进行预处理,那么效果如何?
-
- 程序绝对安全,但很麻烦。
4、java语言中异常处理两种方式
-
1.方法声明的位置上,使用throws关键字,抛给上一级。
- 谁调用就抛给谁,抛给上一级。
-
2.使用try…catch语句进行异常的捕捉。
- 捉住了。
-
注意:异常发生后,如果选择上抛,抛给调用者,调用者需要对这个异常继续进行处理,那么调用者处理这个异常同样有两种方式。
-
注意:异常发生后,如果一直向上抛,最终抛给了main方法,main方法继续上抛,抛给了jvm,程序终止。所以一般抛给了main建议使用try…catch捕捉。
-
public class Test{ public static void mian(String[] args){ //程序执行到此处,发生了ArithmeticException异常,底层 new了一个ArithmeticException异常对象,然后抛出了,由于main 方法调用,所以抛给了main方法,main方法没有处理,所以抛给jvm, 程序终止运行 System.out.println(100/0); System.out.println("hello world"); } }
-
ArithmeticException继承RuntimeException,属于运行时异常。编写程序阶段,无需处理。
-
public class Test{ public static void main(String[] args){ /*第一种:方法声明继续上抛,继续使用:throws,完成异常的继续上 抛. public static void main(String[] args) throws ClassNotFoundException { doSome() } 上抛类似推卸责任,继续把异常抛给调用者。 */ //第2中:try...catch进行捕捉 //异常真正解决了 doSome(); } public static void doSome() throws ClassNotFoundException{ System.out.println("doooo"); } }
-
由于doSome()方法声明位置使用了throws ClassNotFoundException,表示方法执行阶段可能会出现throws ClassNotFoundException异常,叫做类没有找到异常,这个异常类直接父类:Exception,所以ClassNotFoundException属于编译时异常,所以调用doSome()方法必须进行预先的处理,否则编译器会报错。
-
只要异常没有捕捉,采用上报的方式,后续代码不会执行。
-
一个方法体中的代码出现异常后,如果上报的话,此方法结束。
-
5、try…catch
-
1.catch后面的小括号可以是具体的类型,也可以是父类型(多态)。
-
2.catch可以写多个。建议写catch的时候,一个一个处理。
-
3.catch写多个时候,从上到下,必须遵守从小到大的原则。
-
jdk8:新特性 可以使用 | 。
-
如果希望调用者处理,采用上报。不希望上报,使用try…catch。
-
6、异常对象的常用方法
-
1.获取异常简单的描述信息:
- String msg = exception.getMessage();
-
2.打印异常追踪的堆栈信息:
- exception.printStackTarce();
-
3.实际开发中建议使用exception.printStackTarce();
- 异常追踪信息:从上往下一行一行看。
- 注意:sun写的代码就不用看了。看自己的代码。
-
4.关于try…catch中的finally子句。
- 1.在finally子句的代码是最后执行的,并且是一定执行的,即使try语句中的代码块出现了异常。finally子句必须和try一起出现,不能单独执行。
- 2.finally语句通常是用在哪些情况呢?
-
- 通常在finally语句块完成资源的释放/关闭。
-
- 因为fianlly中的代码块比较有保障。
- 即使try语句块中的代码出现异常,finally中代码块也会正常执行。
-
- 注意: 这样 就废了,直接退出了 jvm。退出jvm之后,finally语句代码就不执行了。
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DnL4kbGG-1611319381905)(C:\Users\15124\AppData\Roaming\Typora\typora-user-images\1606742091575.png)]
-
-
//反编译之后效果 public satic int (){ int i = 100; int j = i; i++; return j; }
-
java语言规则:方法体中代码必须遵循自上而下的规则。
- rerurn 一旦执行,整个方法必须结束。
-
fianize方法:调用gc处理器,回收对象。
-
7、自定义异常
-
1.sun公司提供的jdk内置的异常是不够的。在实际开发中,有很多业务出现异常后,jdk倒是没有的。和业务挂钩,那么异常类我们可以自己定义。
-
2.java中怎么自定义异常?
-
-
编写一个类继承Exception或者RuntimeException。
-
提供两个构造方法,一个无参,一个带有String参数的。
-
public class MyException extends Exception{ public MyException(){ } ppublic MyException(String s){ super(s); } } public class Test{ public static void main(String[] args){ MyException e = new MyException("用户名不可为空"); //打印异常堆栈信息 e.printStackTrace(); //获取异常简单信息 String msg = e.getMessage(); System.out.println(msg); } }
-
记住:重写方法时,子类只能比父类抛出更少的异常。
-
总结异常关键字
- try catch finally
- throws 方法声明位置使用,上报异常信息给调用者
- throw 手动抛出异常
-
简单信息
String msg = e.getMessage();
System.out.println(msg);
}
}
```
-
记住:重写方法时,子类只能比父类抛出更少的异常。
-
总结异常关键字
- try catch finally
- throws 方法声明位置使用,上报异常信息给调用者
- throw 手动抛出异常