Java学习日记 2022.7.1


什么是异常处理

  1. 异常是被调用方向调用方传递错误信息的一种途径, 当被调用方的方法在执行过程中出现了问题, 可以通过抛出异常对象, 让调用方捕捉从而实现错误信息的传递。
  2. 使用异常机制可以保证程序代码更加优雅,并提高程序健壮性。
  3. 被调用方抛出的异常对象能清晰的向调用方反应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

NullPointerException空指针异常
1.返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
2.数据库的查询结果可能为 null。
3.集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4.远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5.对于Session中获取的数据,建议进行 NPE检查,避免空指针。
6.级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。

什么是OOM, 为什么会发生OOM

NullPointerException空指针异常
1、自身原因:比如虚拟机本身可使用的内存太少。
2、外在原因:如应用使用的太多,且用完没释放,浪费了内存。此时就会造成内存泄露或者内存溢出。
内存泄露:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了,因为申请者不用了,而又不能被虚拟机分配给别人用。
内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出。

throw和throws的区别

throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象

throw和return的区别

下层方法中正常返回用return
下层方法中异常返回(抛出)用throw

try-catch-finally语法中那一部分可以省略

try不可以省略
catch可以省略
finally可以省略
catch和finally不可以同时省略
try-catch: try中发生的异常被catch捕捉, 程序可以继续往后运行
try-finally: try中发生的异常没有被程序捕捉, 程序会立即退出, 但退出之前会执行finally
try-catch-finally: try中发生异常, 异常代码后面的代码不会执行, 直接进入catch, try中没有发生异常, 不会进入catch, 无论是否发生异常, finally都会执行

一般会在finally块中做什么

在try-catch-finally语法中, 无论执行try还是catch, 最终都会执行finally, 所有我们一般把在try中打开的资源放在finally中进行释放
例如: 在try中创建了数据库连接, 在finally中关闭
在try中创建的IO流, 在finally中关闭
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗
finally会在return之前执行, 但是finally中无法改变返回值的结果
可以理解为执行return的时候, 先确定下了返回值, 但方法还没有出栈, 然后执行finally, 如果finally中改变了返回的变量的值, 也不会对最终返回值产生影响。

final 修饰符 - 最终的

修饰变量,称为常量,值不可以修改
修饰方法,称为最终方法,方法不可以被子类重写
修饰类,称为最终类,类不可以被继承

abstract关键字是否可以与final同时出现

或者这么问能不能同时用abstract和final修饰类或者方法
答案是不能,原因是
1. abstract修饰的类称为抽象类,抽象类不能被实例化,只能被继承,而final是阻止类被继承
2. abstract修饰的方法称为抽象方法,抽象方法必须让子类重写,而final是阻止子类重写

final修饰的变量真的不能改变吗

如果final修饰的变量是基本数据类型,指向常量池的话,那么值不可以修改
如果final修饰的变量是引用数据类型,指向对,那么指针不可以修改,但是指针指向的对象内的成员可以修改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值