说明
主要关于
java的一些概念。
什么是java内存回收机制
许多程序设计语言允许在运行时动态的分配内存(使用到指向内存块开始地址的指针等),当所分配的内存不再被需要(即:指向内存的指针超出使用范围)时,程序或运行环境最好将这些没有被使用到却申请了的内存释放,如果不释放,这些内存积累的越来越多将会造成内存泄露和溢出:
- 在C和C++(或其他语言)中 ,程序人员负责内存的释放,需要判断该内存应该在何时进行释放;
- 在java中,提供后台系统级线程 用于记录每次内存的分配情况,统计内存指针使用的次数,当系统闲置时,垃圾收集线程将检查是否存在引用次数为0的内存指针,并将这些内存指针标记为可分配,在下次需要进行内存申请的时候将这些内存分配出去;
- 总结: Java程序生存期中,后台系统级线程 会 自动的对垃圾内存进行收集,无须用户释放内存。
异常捕获
什么是异常
Java程序在运行中可能会遇到一下问题:
- 异常(Exception),一种非致命性问题,可以通过修正后继续执行(一般在进行代码编写时对于语义和语法的使用上发生了错误,系统抛出异常提示程序员进行更改,以修复程序)。例如“文件找不到”、“运算错误(除零溢出)、数组下标越界”等。当程序发生异常时,会抛出相应的异常对象(异常对象包含了异常的详细信息:异常类型或发生异常时的异常状态),可以针对相应的异常对象,编写相应的处理代码块进行异常捕获或进行处理,从生成异常对象的代码块进行回溯,沿方法的调用栈逐层回溯,找到包含相应异常处理的方法,并交给该方法处理。
- 错误(Error),致命性问题导致程序运行不下去(如内存溢出等),一般情况严重,无法通过修改代码进行程序的修复。
所以在进行程序开发时的代码块需要拥有一定的强壮性,这就需要程序开发人员考虑到自己即将写下的代码是否存在问题,如一些隐性问题等。
可以通过以下方法进行处理:
-
添加if判断 对每一步操作进行if判断,出现错误返回错误编号,这种方法在一定的程度上可以增强代码的强壮性,但是多个if语句进行嵌套会使得代码结构臃肿,而且并不会返回具体的错误信息,而是自己设定的错误编号。
-
Java的异常处理机制预定义的Exception类,定义了程序产生异常的条件,并且允许程序人员编写特殊的异常处理语句,即:发生异常时,程序会执行相应的代码块。
如:try{ 执行代码 }catch(捕获异常类型){ 异常处理 } finally{ 统一处理 }
异常处理机制优点:
- 将异常处理从常规代码中分离出来,增强了代码的可读性。
- 可以根据异常的类型分别进行不同的处理。
- 异常的处理借助调用堆栈的先进后远原则(即优先捕获最先出现的异常)。
异常类型
Java在所有预定义包中都定义了异常类和错误类。异常类(父类):Exception;错误类(父类):Error;以上二者是标准类:Throwable的子类;
- 受检异常:(checked exception)
受检异常的所有类都是类Exception类的子类,包括以下类型异常:ClassNotFoundException(类未找到)、FileNotFoundException(文件未找到)、IOException(输入输出异常)、NoSuchMethodException、WriteAbortedException. - 运行时异常:(runtime exception)
所有运行时异常类都是RuntimeException的子类,而RuntimeException类是Exception类的子类。包括以下类:ArithmeticException(算术异常)、ArrayIndexOutOfBoundsException(数组下标越界异常)、ClassCastException()、EmptyStackException()、IllegalArgumentException()、IllegalStateException()、IndexOutOfBoundsException()、NoSuchElementException()、NullPointerException()、UnsupportedOperationException()、 - 错误(Error),指程序运行时,系统发生不正确的情况(内存溢出等),一般这种情况严重,修改程序代码难以处理,不需要程序员进行处理。
- 类关系图(异常和错误)