Java学习日记 2022.7.1

文章目录

    • 什么是异常处理
    • Java异常体系类图
    • Exception和Error的区别
    • Exception和RuntimeException的区别
    • 常见的异常有哪些
    • 什么是NPE, 为什么会发生NPE
    • 什么是OOM, 为什么会发生OOM
    • throw和throws的区别
    • throw和return的区别
    • try-catch-finally语法中那一部分可以省略
    • 一般会在finally块中做什么
    • final 修饰符 - 最终的
    • abstract关键字是否可以与final同时出现
    • final修饰的变量真的不能改变吗


什么是异常处理

  1. 异常是被调用方向调用方传递错误信息的一种途径, 当被调用方的方法在执行过程中出现了问题, 可以通过抛出异常对象, 让调用方捕捉从而实现错误信息的传递。
  2. 使用异常机制可以保证程序代码更加优雅,并提高程序健壮性。
  3. 被调用方抛出的异常对象能清晰的向调用方反应what, where, why这3个问题:
    异常类型反应了“什么”被抛出
    异常堆栈跟踪反应了“在哪”抛出
    异常信息反应了“为什么”会抛出

Java异常体系类图

Java学习日记 2022.7.1_第1张图片

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修饰的变量是引用数据类型,指向对,那么指针不可以修改,但是指针指向的对象内的成员可以修改

你可能感兴趣的:(学习日记,java,学习,开发语言)