面试中经常会被问到error和exception的区别,在这边稍微说一下。下图是一个总的继承关系:

    

java 如何获取new Exception java获取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文档才是王道