2019.07.12(day11)
●异常
java中有三种错误:
1.语法错误/编译错误:
在ide(集成开发环境)工具(eclipse,myeclipse等)中写代码,代码写错了,在工具中用红波浪线或红叉来表示。
如果显示红波浪线,此代码是不能通过工具进行编译的,不能编译就不能执行。
2.逻辑错误:
前提是语法没有错误,程序可以编译,能运行,但结果是错误的。
一般原因就是代码的逻辑写错了,最终结果也是错误的。
3.运行错误/异常/例外:
前提是逻辑没有错误,但在运行期间因为某种原因导致错误,程序意外终止,这种错误就叫做异常。
一定要注意,异常是在运行期间发生的。
比如:
int num1,num2;这两个值需要从键盘录入
int result=num/num;
如果num2录入的是非零值,程序可以正常运行
如果num2录入的是零值,程序不能正常运行,
代码的逻辑正确,有异常,且程序意外终止
处理异常的目的:
1.避免程序意外终止
2.如果出现了异常,程序不能终止,还要给一个友好的提示
程序意外终止:就是程序执行到某个位置的时候,不执行了
jvm就不继续执行这个程序了
处理的方案有两种:
方案一:
用java代码提供的异常处理机制try catch finally
try{
result=num1/num2;
}catch(ArithmeticException e){
System.out.println("分母不能为零");
}
快捷键 alt+shift+z 来调整代码块的模板
方案二:
用java的逻辑代码来处理,即用java代码容错
if(num2!=0){
result=num1/num2;
}else{
System.out.println("分母不能为零");
}
用java的try catch finally处理异常的注意事项:
try:
用来监视代码段
一个try可以有0个或1个或多个catch
一个try可以没有catch,但必须有finally
catch:
抓取相应的异常
catch中一般有两类代码
1.栈的轨迹
2.友好的提示代码
finally:
释放内存的空间
执行完当前catch块中的代码块后,会跳过后面所有的catch,执行finally块中的代码
不论有没有异常,最终都会执行finally块,用户申请销毁申请的内存
try中监视的代码可能产生n种异常,所以需要写n个catch来抓取异常,但可能还是会有遗漏,所以要添加第n+1个异常,catch(Exception e)且此catch放在所有的catch后。
异常的继承层次:Throwable(顶级类,有两个子类)
1.Error类:
不是程序员使用的,一般情况下是jvm使用的。
(比如:要在一个u盘中写一个文件,但是没有u盘这个设备,那么就需要jvm来处理)
2.Exception类:
是程序员能够写代码处理异常的根类(分为两类)
①.免检异常:不是必须添加try catch finally的,程序可以编译运行,执行时会自动终止。
RuntimeException 运行时异常
ArithmethicException 算术异常
NullPointerException 空指针异常
ArrayIndexOutofBoundsException 数组下标越界异常
NumberFormatException 数字格式异常
InputMismatchException 输入不匹配异常
...等
②.必检异常:必须添加try catch finally,如果不添加,会有红波浪线提示,不能编译运行。
Exception 所有程序员能处理的异常的根类
SQlException sql异常
ClassNotFoundException 类没有发现异常
FileNotFoundException 文件没有发现异常
...等
throw:
是语句抛出的一个异常,一般在代码块的内部,程序员根据实际需求来抛出异常。
throws:
是方法可能会抛出某种异常的声明,放在方法体的后面,多个异常类型之间用逗号隔开。
谁调用了此方法,谁就用try catch来处理这个异常。
自定义异常:
程序员自己创建的java类,但是必须继承自Exception及其子类
垃圾收集管理器(GC):(针对的是堆空间)
是java的一个后台线程,此线程完成的功能是收集堆空间中没有引用对象的内存空间,并释放空间。
能够释放没用的对象空间,程序员是无法掌握GC调用的。
新生代区:young generation
伊甸园区:Eden
所有新创建的对象都放在此区
幸存区:Survivor
在Eden区中经过一个扫描,此对象还存在,就把对象从Eden区移动到此区。
一个Eden区对应两个survivor 8:1:1,最后一个survivor区是空闲的系统保留区。
老生代区:old generation
在幸存区经过多次扫描对象,还存在于幸存区中,就把幸存区的对象移到老生代中。
老生代扫描对象是否可用的频率远低于幸存区的扫描频率。
在老生代长时间存在的对象,建议把其放在方法区,以减少扫描频率。
minor gc 初代回收:收集的是新生代的Eden区的空间。
full gc 完全回收:收集的是老生代的内存空间