Java关键字
Java关键字整理 | ||||||||||||||
基本数据类型 | 直接量 | 流程控制 | 修饰符 | 面向对象 | 异常处理 | 其他 | 保留字 | |||||||
选择分支 | 循环 | 其他 | 权限 | 其他 | 包 | 类型 | 继承/实现 | 对象 | 其他 | |||||
byte | true | if | do | break | private | static | package | class | extends | new | void | try | transient | goto |
short | false | else | while | continue | protected | final | import | interface | implements | instanceof | catch | volatile | const | |
int | null | switch | for | return | public | abstract | enum | this | finally | native | ||||
long | case | super | throw | synchronized | ||||||||||
float | default | throws | ||||||||||||
double | ||||||||||||||
char | ||||||||||||||
boolean |
异常体系整理
什么是异常处理
-
异常是被调用方向调用方传递错误信息的一种途径, 当被调用方的方法在执行过程中出现了问题, 可以通过抛出异常对象, 让调用方捕捉从而实现错误信息的传递。
-
使用异常机制可以保证程序代码更加优雅,并提高程序健壮性。
-
被调用方抛出的异常对象能清晰的向调用方反应what, where, why这3个问题:
异常类型反应了“什么”被抛出
异常堆栈跟踪反应了“在哪”抛出
异常信息反应了“为什么”会抛出
Java异常体系类图
Exception和Error的区别
Exception和Error同属于Throwable的直接子类, 是2个体系
Exception 体系的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。
Error体系的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测, 我们也不需要对这类错误进行捕获处理(因为你捕捉了也没用), 一旦这类错误发生, 应用程序会被终止。
Exception和RuntimeException的区别
RuntimeException是Exception的子类
Exception是受检的, 称为编译时异常
RuntimeException是不受检的, 称为运行时异常
PS: 这题的问法也可能是 "受检异常和不受检异常的区别是什么"
答: 受检异常指的是在编译时接受编译器的检查, 如果没有处理异常则不能通过编译, Exception类及其子类都属于受检异常, RuntimeException类
常见的异常有哪些
受检: 接受编译器的检查
Error错误(不受检) | Exception 编译时异常 (受检) | RuntimeException运行时异常 (不受检) |
内存溢出OutOfMemoryError | 数据库异常SQLException | 空指针异常NullPointerException |
栈溢出StackOverflowError | 类找不到异常ClassNotFoundException | 类型转换异常ClassCastException |
IO流异常IOException | 算术异常ArithmeticException | |
文件找不到异常FileNotFoundException | 索引越界异常IndexOutOfBoundsException | |
输入不匹配异常InputMismatchException | ||
数字转换异常NumberFormatException |
什么是NPE, 为什么会发生NPE
NPE全称叫:NullPointerException,中文意思是:空指针异常
用指针指向在堆区中相对应的地址元素的时候,指针是null,查询不到开辟的内存空间,系统会出现NPE
如何防止NPE?
因为NPE出现的关键是指针为null,所以当我们使用指针进行操作的时候,如果不确定指针是否为null,应该对指针做非空判断,判断指针为null时,使用new关键字开辟内存空间,来防止NPE出现
什么是OOM, 为什么会发生OOM
内存溢出OutOfMemoryError;当jvm进行内存垃圾回收的时候,有的元素数据依然被指针指向导致无法回收,累积下来会导致内存不足溢出,会发生OOM
throw和throws的区别
-
throw是语句抛出一个异常,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常;throws是方法可能抛出异常的声明(用在声明方法时,表示该方法可能要抛出异常),当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理
-
throws出现在方法函数头;而throw出现在函数体。
-
throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
-
两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
throw和return的区别
-
Throw的作用与return很像
-
Return的作用是方法返回,并且可以根据返回值类型返回相应的变量
-
Throw的作用也是方法返回,但是只能返回异常对象,也就是说throw后面跟的对象必须是throwable的子类创建的
-
正常返回用return;异常抛出用throw