一、Java中的异常
1、Exception和Error的区别
2、Checked Exception和Unchecked Exception有什么区别?
4、异常处理的方法
- 捕获异常:try-catch
- 抛出异常:throw、throws
5、throw和throws的区别
- throws跟在方法声明后面,后面接的是 异常类名 ;throw用在方法体内,后面接的是 异常类对象名 ;
- throws后面可以跟多个异常类名,用逗号隔开;throw后面只能抛出一个异常对象名;
- throws表示抛出异常,由该方法的调用者来处理;throw表示抛出异常,由方法体内的语句来处理;
- 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修饰变量的情况
- final修饰成员变量,初始化的方法有3种:1.定义时直接赋值;2.构造器中赋值(每个构造器中都得赋初始值,因为不知道会调用哪个构造);3.static静态代码块中赋值;
- final修饰静态成员变量,初始化的方法:定义的时候就必须赋初始值;
- final修饰引用类型变量,引用不可变,不变指的是引用不变,而不是这个引用指向的对象内容不变(即引用的地址不能变,至于地址存的内容没有要求)。
8、如何使用try-with-resources代替try-catch-finally?
9、异常使用的注意事项
10、内存泄漏的场景
00M,全称 “Out Of Memory”,翻译成中文就是“内存用完了”,意思就是说,当JVM因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个error。
- 静态集合类
如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。 - 资源未关闭或未释放
如数据库连接、IO流等。在这些连接之后没有使用close方法来释放连接或者关闭流操作等,将会造成大量的对象无法被回收,从而引起内存泄漏。 - 变量不合理的作用域
一般而言,一个变量的定义的作用范围 > 其使用范围,很有可能会造成内存泄漏。另一方面,如果没有及时地把对象设置为null,很有可能导致内存泄漏的发生。
Q:内存泄漏和内存溢出的区别?
内存泄露 就是申请的内存空间没有被正确释放,导致内存被白白占用。
内存溢出 就是申请的内存超过了可用内存,内存不够了。
两者关系: 内存泄露可能会导致内存溢出。
Q:内存溢出的场景?
- Java堆溢出: Java堆用于储存对象实例,只要不断创建不可被回收的对象,比如静态对象,那么随着对象数量的增加,总容量触及最大堆的容量限制后就会产生内存溢出异常(OutOfMemoryError)。
- 虚拟机栈OutOfMemoryError: JDK使用的HotSpot虚拟机的栈内存大小是固定的,我们可以把栈的内存设大一点,然后不断地去创建线程,因为操作系统给每个进程分配的内存是有限的,所以到最后,也会发生OutOfMemoryError异常。
11、空指针问题
当一个变量的值为null时,在Java里面表示一个不存在的空对象,没有实际内容,没有给它分配内存,没有进行初始化操作,这时候,如果调用这个对象的方法或者变量,就会出现空指针异常。
空指针属于运行时异常RuntimeException的子类,它不是捕获型的,只有在程序运行时才可能报出来。
空指针可能出现的场景:
- 字符串常量未初始化,equals比较时导致空指针异常;
- 接口类型的对象(list等)没有使用具体的类进行初始化,调用本身方法时导致空指针异常;
- 对象为空,但未进行判空导致空指针异常;
User user = null; user.getName();
- Hashtable不允许null值,当put为null时,导致空指针。