• 【Java八股文总结】之异常


    Java异常

    一、Java中的异常

    在这里插入图片描述

    1、Exception和Error的区别

    在这里插入图片描述

    2、Checked Exception和Unchecked Exception有什么区别?

    在这里插入图片描述

    3、Throwable类常用的方法有哪些?

    在这里插入图片描述

    4、异常处理的方法
    • 捕获异常:try-catch
    • 抛出异常:throw、throws
    5、throw和throws的区别
    1. throws跟在方法声明后面,后面接的是 异常类名 ;throw用在方法体内,后面接的是 异常类对象名
    2. throws后面可以跟多个异常类名,用逗号隔开;throw后面只能抛出一个异常对象名
    3. throws表示抛出异常,由该方法的调用者来处理;throw表示抛出异常,由方法体内的语句来处理
    4. throws表示有出现异常的可能性,未必会出现异常;throw则是抛出了异常,执行throw一定会出现异常
    6、try-catch-finally如何使用?

    在这里插入图片描述
    在这里插入图片描述

    7、finally块中的代码一定会执行么?

    不一定。
    在这里插入图片描述

    Q:final、finally、finalize的区别?
    • final用于修饰变量、方法和类。
      ①final修饰变量: 被修饰的变量不可变,不可变分为 引用不可变 和 对象不可变 ,final 指的是 引用不可变 ,final修饰的变量必须初始化,通常称被修饰的变量为常量 。
      ②final修饰方法: 被修饰的方法不允许任何子类重写,子类可以使用该方法。
      ③final修饰类: 被修饰的类不能被继承,所有方法不能被重写

    • finally 作为异常处理的一部分,它只能在 try/catch 语句中,并且附带一个语句块表示这段语句最终一定被执行(无论是否抛出异常),经常被用在需要释放资源的情况下,System.exit (0) 可以阻断finally 执行。

    • finalize() 是在 java.lang.Object 里定义的方法,在垃圾回收时使用,也就是说每一个对象都有这么个方法,这个方法在gc启动,该对象被回收的时候被调用
      一个对象的 finalize方法只会被调用一次,finalize被调用不一定会立即回收该对象,所以有可能调用finalize后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会再次调用finalize了,进而产生问题,因此不推荐使用finalize方法。

    Q:final修饰变量的情况
    1. final修饰成员变量,初始化的方法有3种:1.定义时直接赋值;2.构造器中赋值(每个构造器中都得赋初始值,因为不知道会调用哪个构造);3.static静态代码块中赋值;
    2. final修饰静态成员变量,初始化的方法:定义的时候就必须赋初始值;
    3. final修饰引用类型变量,引用不可变,不变指的是引用不变,而不是这个引用指向的对象内容不变(即引用的地址不能变,至于地址存的内容没有要求)。
    8、如何使用try-with-resources代替try-catch-finally?

    在这里插入图片描述
    在这里插入图片描述

    9、异常使用的注意事项

    在这里插入图片描述

    10、内存泄漏的场景

    00M,全称 “Out Of Memory”,翻译成中文就是“内存用完了”,意思就是说,当JVM因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个error。

    1. 静态集合类
      如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
    2. 资源未关闭或未释放
      如数据库连接、IO流等。在这些连接之后没有使用close方法来释放连接或者关闭流操作等,将会造成大量的对象无法被回收,从而引起内存泄漏。
    3. 变量不合理的作用域
      一般而言,一个变量的定义的作用范围 > 其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为null,很有可能导致内存泄漏的发生。
      在这里插入图片描述
    Q:内存泄漏和内存溢出的区别?

    内存泄露 就是申请的内存空间没有被正确释放,导致内存被白白占用。
    内存溢出 就是申请的内存超过了可用内存,内存不够了。
    两者关系: 内存泄露可能会导致内存溢出。

    Q:内存溢出的场景?
    1. Java堆溢出: Java堆用于储存对象实例,只要不断创建不可被回收的对象,比如静态对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常(OutOfMemoryError)。
    2. 虚拟机栈OutOfMemoryError: JDK使用的HotSpot虚拟机的栈内存大小是固定的,我们可以把栈的内存设大一点,然后不断地去创建线程,因为操作系统给每个进程分配的内存是有限的,所以到最后,也会发生OutOfMemoryError异常。
    11、空指针问题

    当一个变量的值为null时,在Java里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,没有进行初始化操作,这时候,如果调用这个对象的方法或者变量,就会出现空指针异常。
    空指针属于运行时异常RuntimeException的子类,它不是捕获型的,只有在程序运行时才可能报出来。
    空指针可能出现的场景:

    1. 字符串常量未初始化,equals比较时导致空指针异常;
    2. 接口类型的对象(list等)没有使用具体的类进行初始化,调用本身方法时导致空指针异常;
    3. 对象为空,但未进行判空导致空指针异常;
     User user = null;  user.getName();  
    
    • 1
    1. Hashtable不允许null值,当put为null时,导致空指针。
  • 相关阅读:
    第04章 Scrapy 入门
    数据可视化高级技术Echarts(桑基图&入门)
    视频播放器的技术组成
    网页头部的声明应该是用 lang="zh" 还是 lang="zh-CN"?
    30.3.2 使用GRANT语句为用户授权
    Apache-maven的安装与配置(IDEA)
    如何评判程序员的好坏和程序员成长的各个阶段
    新手小白适合做哪个跨境电商平台?测评自养号能带来哪些收益及优势?
    KVM
    哈里斯鹰算法优化BP神经网络(HHO-BP)回归预测研究(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/qq_46111316/article/details/127934483