【Java八股文总结】之异常

文章目录

    • Java异常
      • 一、Java中的异常
        • 1、Exception和Error的区别
        • 2、Checked Exception和Unchecked Exception有什么区别?
        • 3、Throwable类常用的方法有哪些?
        • 4、异常处理的方法
        • 5、throw和throws的区别
        • 6、try-catch-finally如何使用?
        • 7、finally块中的代码一定会执行么?
          • Q:final、finally、finalize的区别?
          • Q:final修饰变量的情况
        • 8、如何使用try-with-resources代替try-catch-finally?
        • 9、异常使用的注意事项
        • 10、内存泄漏的场景
          • Q:内存泄漏和内存溢出的区别?
          • Q:内存溢出的场景?
        • 11、空指针问题

Java异常

一、Java中的异常

【Java八股文总结】之异常_第1张图片

1、Exception和Error的区别

【Java八股文总结】之异常_第2张图片

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

【Java八股文总结】之异常_第3张图片

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

【Java八股文总结】之异常_第4张图片

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如何使用?

【Java八股文总结】之异常_第5张图片
【Java八股文总结】之异常_第6张图片

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

不一定。
【Java八股文总结】之异常_第7张图片

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?

【Java八股文总结】之异常_第8张图片
【Java八股文总结】之异常_第9张图片

9、异常使用的注意事项

【Java八股文总结】之异常_第10张图片

10、内存泄漏的场景

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

  1. 静态集合类
    如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
  2. 资源未关闭或未释放
    如数据库连接、IO流等。在这些连接之后没有使用close方法来释放连接或者关闭流操作等,将会造成大量的对象无法被回收,从而引起内存泄漏。
  3. 变量不合理的作用域
    一般而言,一个变量的定义的作用范围 > 其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为null,很有可能导致内存泄漏的发生。
    【Java八股文总结】之异常_第11张图片
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. Hashtable不允许null值,当put为null时,导致空指针。

你可能感兴趣的:(Java学习乐园,java,jvm,开发语言)