检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
运行时异常:空指针异常 类型转换异常 算术异常 序列化异常 端口异常 数字格式转换异常
检查性异常 :ClassNotFoundException SQLException IOException FileNotFoundException InterruptedException SocketException RemoteException 下标越界异常
自定义异常时继承Exception和RunTimeException的区别?
Java compiler要求所有的Exception 要么被catch,要么被throw,除非这是一个RuntimeExeption (e instanceof RuntimeException)。也就是说,通常的Exception一定要被处理,也即我们所说的 checked exception,而RuntimeException不强制要求处理,(当然你自己要处理也可以),所以我们称为unchecked exception。
Java的内存泄漏
理论上Java 因为有垃圾回收机制( GC)不会存在内存泄露问题( 这也是Java 被广泛使用于服务器端编程的一个重要原因)
如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。
(转载)
public class Simple {
Object object;
public void method1(){
object = new Object();
//...其他代码
}
}
这里的object实例,其实我们期望它只作用于method1()方法中,且其他地方不会再用到它,但是,当method1()方法执行完成后,object对象所分配的内存不会马上被认为是可以被释放的对象,只有在Simple类创建的对象被释放后才会被释放,严格的说,这就是一种内存泄露。解决方法就是将object作为method1()方法中的局部变量。当然,如果一定要这么写,可以改为这样:
public class Simple {
Object object;
public void method1(){
object = new Object();
//...其他代码
object = null;
}
}
GC 是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃, Java 提供的GC 功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放已分配内存的显示操作方法。Java 程序员不用担心内存管理, 因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM 可以屏蔽掉显示的垃圾回收调用。
垃圾回收可以有效的防止内存泄露, 有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收, 程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java 诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java 的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS 的系统比Android 系统有更好的用户体验,其中一个深层次的原因就在于Android 系统中垃圾回收的不可预知性。
(转载)
四种引用 :强引用 软引用 弱引用
我觉得我应该直接转载别人介绍清楚的文章
阿里面试: 说说强引用、软引用、弱引用、虚引用吧 - 云+社区 - 腾讯云 (tencent.com)
简要提一下:
JDK1.2以前引用类型只有两种状态被引用和没有被引用,太单调,不符合开发
JDK1.2扩充四种引用概念
- 强引用(Strong Reference)
- 软引用(Soft Reference)
- 弱引用(Weak Reference)
- 虚引用(Phantom Reference)
强引用(Strong Reference)
直接用new创建对象就是,这样的化调用system.gc()也不会回收创建的对象,JAVA存在的内存泄露一般都是由强引用造成
软引用(Soft Reference)
只有当内存不足时才会释放
使用方法
Object o1 = new Object();
SoftReference<Object> s1 = new SoftReference<Object>(o1);
弱引用(Weak Reference)
对于只有弱引用的对象来说,只要垃圾回收机制一运行,不管 JVM 的内存空间是否足够,都会回收该对象占用的内存。
Object o1 = new Object();
WeakReference<Object> w1 = new WeakReference<Object>(o1);
虚引用(Phantom Reference)(搞不懂)以下转载
虚引用也称为“幽灵引用”或者“幻影引用”,它是最弱的一种引用关系。
虚引用,顾名思义,就是形同虚设,与其他几种引用都不太一样,一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。
虚引用需要java.lang.ref.PhantomReference
来实现。
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(RefenenceQueue)联合使用。
虚引用的主要作用是跟踪对象垃圾回收的状态。仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制。
PhantomReference 的 get 方法总是返回 null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入 finalization 阶段,可以被 GC 回收,用来实现比 finalization 机制更灵活的回收操作。
换句话说,设置虚引用的唯一目的,就是在这个对象被回收器回收的时候收到一个系统通知或者后续添加进一步的处理。
Java 允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。
使用
Object o1 = new Object();
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<Object>();
PhantomReference<Object> phantomReference = new PhantomReference<Object>(o1,referenceQueue);
- throw与throws的比较
- 1、throws出现在方法函数头;而throw出现在函数体。
2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理