运行时异常与非运行时异常的区别?
运行时异常 RuntimeException 和错误 Error 都能被捕捉
运行时异常是不可查异常,不需要对其进行显式的捕捉 非运行时异常是可查 异常,必须要对其进行显式的捕捉,抛出,不然编译器会报错不允许程序运行
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
处理异常可以使用 try-catch-finally 也可以用try-catch 或者try-finally来处理
打印异常的方法
void printStackTrace() 输出异常的堆栈信息
String getMessage() 返回异常信息描述字符串, 是 printStackTrace()输出信息的一部分
多重catch块
排列catch 语句的顺序:先子类后父类
• 发生异常时按顺序逐个匹配
• 只执行第一个与异常类型匹配的catch语句
throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
在调用会抛出异常的方法时,两种处理方法:
调用者处理异常
调用者继续声明异常
main()方法声明的异常由Java虚拟机处理
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
定义一个异常的类 继承于exception类(或其他异常类)然后复写其构造方法
使用时就 throw new 自定义的异常类的名称(“输出的异常信息提示”);
异常处理原则
异常处理与性能
异常只能用于非正常情况
不要将过于庞大的代码块放在try中
在catch中指定具体的异常类型
需要对捕获的异常做处理
finally块中语句不执行的情况
在程序执行时 调用exit()方法关闭了jvm虚拟机
try-catch-finally中存在return语句的执行顺序
当try和finally中都有return语句时,系统执行到try语句块中的return时,会先检测 finally语句块有没有执行,
如果没有执行,直接去执行finally语句块
throw与throws
throw
生成并抛出异常
位于方法体内部,
抛出一个异常对象,且只能是一个
throws
声明方法内抛出的异常
必须跟在方法参数列表后面,不能单独使 用
声明抛出异常类型,可以跟多个异常
面试题:try-catch块中存在return语句,是否还执行 finally块? 如果执行,说出执行顺序
import java.util.Scanner;
public class ExceptionTest2 {
public static void main(String[] args) {
int name = ExceptionTest2.name();
System.out.println(name);
}
public static int name() {
int b= 0;
try {
b++;
Scanner sc= new Scanner(System.in);
int a= sc.nextInt();
return b;
} catch (Exception e) {
e.printStackTrace();
}finally {
b++;
// return b;
}
return b;
}
}
结论是 如果没有异常 值就为1 但是依然会执行finally块中的代码 但是依然会回到try中去返回之前的值(也就是说 finally中对b的修改没有被采用 因为在执行try中的代码时已经执行到return了 此时b的值已经被固定了)如果发生了异常 值就会为2,因为还没有执行到return,
如果想在finally中修改b的值,可以在finally中return,可以但是不建议这样在catch或finally中修改值然后return,