异常概述
Error和Exception的区别?
Error类和Exception类的父类都是Throwable类。
Error类:严重错误,由虚拟机抛出,java程序无法解决该问题;
Exception类:指的是代码逻辑的异常,又分为运行时异常(RuntimeException)和受检异常(CheckedExceptio);
RuntimeException与CheckedException有何异同?
区分 | 运行时异常 非受检异常 | 受检异常 |
---|---|---|
名称 | RuntimeException | Checked Exception |
异常出现的原因 | 程序逻辑错误 | 与程序运行的上下文环境有关 |
是否必须处理 | 否,可以选择捕获处理也可以不处理 | 是,必须处理,不处理编译不通过 |
如何处理 | 解决程序逻辑错误 | 使用try…catch捕获 使用throws声明抛出交给父类处理 |
常见的异常类有哪些?
类名 | 说明 |
---|---|
NullPointerException | 空指针异常,访问的当前对象为空对象 |
IndexOutOfBoundsException | 索引超出范围异常,比如数组、字符串等的索引 |
FileNotFoundException | 文件访问空异常,通过指定路径名访问文件的时候,文件不存在; |
IOException | 当发生某种 I/O 异常时,抛出此异常。此类是失败或中断的 I/O 操作生成的异常的通用类 |
IllegalArgumentException | 抛出的异常表明向方法传递了一个不合法或不正确的参数 |
SQLException | 提供关于数据库访问错误或其他错误信息的异常 |
ClassCastException | 当试图将对象强制转换为不是实例的子类时,抛出该异常 |
异常处理
try-catch-finally
finally块中的代码什么时候执行?
finally块中的代码是在return之前执行。即使return出现在try或者catch中。
程序执行return表示结束对当前函数的调用并跳出这个函数体,任何语句的执行只能在return前执行。
finally块的作用是:为了保证无论出现什么情况,finally块里的代码一定会被执行。
finally是不是一定会被执行到?
不一定会被执行到。
不会执行finally块的三种情况:
- 程序进入try块之前就出现异常时,会直接结束,不会执行finally块(没有进入try);
- 程序在try块被强制退出时,不会去执行finally块中的代码,比如try块中执行exit方法(使用System.exit() 终止当前虚拟机)。
- 守护进程被终止。守护线程停止的条件:其他线程执行结束,main线程也执行结束,此时jvm虚拟机会退出,相应的守护线程也会退出。
try-catch-finally中,如果catch中存在return,finally还会执行吗?
在try、catch中添加return,finally会执行。
程序执行到return时会首先将返回值存储到指定的位置,再去执行finally块,最后再返回。
如果finally中含有return语句,会覆盖掉其他地方的return。
返回值类型不同的影响:
类型 | 影响 |
---|---|
基本数据类型 | 无影响 改变返回值且没有return→没有任何影响 改变返回值且有return→直接覆盖 |
引用数据类型 | 有影响 返回的是在finally 对前面return语句返回对象的修改值,无论finally块中是否有return |
return返回值类型是基本数据类型
- return在try、catch、finally中都存在,finally中的result会覆盖try/catch中的result。
// idea_face-javaface2-finallyReturnDemo
public class ReturnDemo1 {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int result = 0;
try {
result = 1;
return result+1;
}catch (Exception e) {
return result;
}finally {
return result;
}
}
// 输出结果是1
** 首先进入try中,返回值是2,再执行finally,修改结果为1,
}
- try、catch有return,finally没有return,但是对基本数据类型result进行了修改,返回值result依旧是try/catch中的值。
// idea_face-javaface2-finallyReturnDemo
public class ResultDemo2 {
public static void main(String[] args) {
System.out.println(test());
}
public static int test(){
int result = 0;
try {
result = 1;
return result;
}catch (Exception e) {
return result;
}finally {
result = 2 ;
}
}
// 输出结果是1
** 因为进入try后,执行return,会将result的值1存放在栈中,然后去执行finally中的语句,最后再返回存储值1的栈地址。
}
return返回值类型是引用数据类型
无论finally中是否有return,finally修改后的result对象都会被输出。因为引用数据类型存入栈的是地址,所以修改地址对应的内容会改变返回对象的内容。
// idea_face-javaface2.finallyReturnDemo
public class ResultDemo4 {
public static void main(String[] args) {
System.out.println(test4());
}
public static StringBuilder test4() {
StringBuilder result = new StringBuilder("A");
try {
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
return result;
}
}
// 输出值是AB
}
// idea_face-javaface2.finallyReturnDemo
public class ResultDemo5 {
public static void main(String[] args) {
System.out.println(test4());
}
public static StringBuilder test4() {
StringBuilder result = new StringBuilder("A");
try {
return result;
} catch (Exception e) {
return result;
} finally {
result.append("B");
}
}
// 输出值是AB
}
try-catch-finally中那个部分可以省略?
catch和finally可以省略其中一个,但必须保留一个。
throw和throws
throw和throws的区别?
区别 | throw | throws |
---|---|---|
书写位置 | 在方法内部 | 在方法的定义上 |
表示什么 | 具体向外抛出异常的动作,抛出某种异常对象(实例) 代码语句 throw new 异常类名() | 可能抛出某种异常 |
异常由谁处理 | 方法体内部的语句 | 方法的调用者处理 |
主线程可以捕获到子线程的异常吗?
正常情况下,如果不做特殊的处理,在主线程中是不能够捕获到子线程中的异常。
原因:
如果主线程可以捕获子线程的异常,会违背线程设计的理念;
线程设计的理念:“线程的问题应该线程自己本身来解决,而不要委托到外部”。
要想在主线程中捕获子线程的异常,使用Thread的静态方法。
Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandle());
关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws 出现在方法申明上,表示可能会抛出某个异常;
throw 出现在方法内容,表示抛出一个指定异常,throw new 异常类名();
try catch 在try中有可能会抛出某个异常,一旦抛出异常,会在catch中进行捕获;
finally 表示无论是否捕获到异常,都会执行;
五个你最常见到的runtime exception。
异常名字 | 解释 | 案例 |
---|---|---|
ArrayIndexOutBoundsException | 数组越界异常 | 数组长度是5,遍历数组的索引值大于5 |
NegativeArraySizeException | 数组长度为负异常 | 由于创建数组必须指定数组长度,当数组长度误写为负数时,会产生异常 |
IllegalArgumentException | 非法参数异常 | 创建线程并设置线程优先级,setPriority(参数),只能是1-10之间数,如果设置1000会报错误 |
NullPointerException | 空指针异常 | 比如前后端传输和接收参数不匹配问题,后端需要3个参数,前端只传来2个参数 |
IllegalStateException | 非法状态异常 | 比如启动项目的时候,项目中使用了es服务,但是es服务启动 |
ClassCastException | 类型转换异常 | 不能强行转换的时候会引发错误, |
扩展202/8/30
es服务 = 开源的分布式搜索引擎,可以提供存储和搜索功能。