面试中经常会被问到error和exception的区别,在这边稍微说一下。下图是一个总的继承关系:
Error: 一般有了Error程序就挂了,而且这时候好像不能人为解决,不能用try/catch解决,比如内存溢出了不够了,这个时候交给JVM接管。
Exception:你写的代码可能会导致的异常,主要分两种,一种是check的编译时异常,一种是runtime的运行时异常。一般可能出现Exception的代码放在try块中,然后在catch块中做相应的处理
CheckedException:顾名思义,就是编译的时候就可以检查出的异常,主要有IOException,InterruptedException。
IOException:比较简单,比如需要读取account.txt文件,结果在给定的路径上jvm没有发现指定的读写文件,就会报 IOException。
InterruptedException:阻塞的线程调用interrupted()方法,该线程会抛出InterruptedException,然后跳出,事例代码如下:
package com.fc.model;
public class Test implements Runnable {
@Override
public void run(){
try{
Thread.sleep(8000);
}
catch(InterruptedException ex){
System.out.println("Catch an interruptedException");
}
}
public static void main(String[] args){
Runnable task=new Test();
Thread t= new Thread(task);
t.start();
t.interrupt();
}
}
最后输出Catch an interruptedException。需要注意的是必须给阻塞中的线程调用interrupt方法才会抛出InterruptedException,然后被catch块接管,所以此处用Thread.sleep(8000)使其进入阻塞态;非阻塞态的线程调用interrupt方法不会有任何变化。
RuntimeException:顾名思义,就是编译的时候就无法检查的异常,只有在运行的时候才有可能发生的异常,主要有ClassCastException,NullPointerException,IndexOutOfBoundsException。
ClassCastException: 向下转型的时候可能会抛出的异常,一个简单的例子就是不加任何泛型的ArrayList,如下:
package com.fc.model;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
ArrayList a=new ArrayList();
a.add("1");
a.add(2);
int i=(int)a.get(0);
}
}
<pre name="code" class="java">
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integerat com.fc.model.Test.main(Test.java:10)
控制台中显示,代码在int i=(int)a.get(0);这句话发生了ClassCastException,因为向不加任何泛型的ArrayList中加入元素再取出来的时候,其类型都是Object,而index为0的位置原来存放的是String类型的"1",取出来是Object,转成int就发生了ClassCastException。
NullPointerException: 字面上翻译为空指针,个人理解就是引用指向了null,试图调用该引用的方法数值什么的就出现了该异常,代码如下:
package com.fc.model;
public class Test {
static int[] a;
public static void main(String[] args){
<span style="white-space:pre"> </span>System.out.print(a[0]);
}
}
Exception in thread "main" java.lang.NullPointerException
at com.fc.model.Test.main(Test.java:10)
其中实例静态变量a初始化为null。
IndexOutOfBoundsException: 索引越界了,又分为两个子类:ArrayIndexOutOfBoundsException和StringIndexOutOfBoundsException。这两个从字面上理解就可以了,前一个是数组越界,后一个是字符串越界。代码如下:
package com.fc.model;
public class Test {
public static void main(String[] args){
int[] a={1,2,3};
System.out.print(a[6]);
}
}
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at com.fc.model.Test.main(Test.java:5)
package com.fc.model;
public class Test {
public static void main(String[] args){
String s="abc";
System.out.print(s.charAt(6));
}
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 6
at java.lang.String.charAt(String.java:658)
at com.fc.model.Test.main(Test.java:5)
当然,Exception还远远不止这些,还是那句老话,实践是检验API的唯一真理,多去查API文档才是王道
。