异常

运行时异常与非运行时异常的区别?
运行时异常 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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值