1、基本概念java
Throwable是全部异常的根,java.lang.Throwable
Error是错误,java.lang.Error
Exception是异常,java.lang.Exception数组
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),两者都是 Java 异常处理的重要子类,各自都包含大量子类。测试
Error(错误):是程序没法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操做无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 再也不有继续执行操做所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)通常会选择线程终止。spa
这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,由于它们在应用程序的控制和处理能力之 外,并且绝大多数是程序运行时不容许出现的情况。对于设计合理的应用程序来讲,即便确实发生了错误,本质上也不该该试图去处理它所引发的异常情况。在 Java中,错误经过Error的子类描述。线程
Exception(异常):是程序自己能够处理的异常。设计
Exception 类有一个重要的子类 RuntimeException。RuntimeException 类及其子类表示“JVM 经常使用操做”引起的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引起运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。code
注意:异常和错误的区别:异常能被程序自己能够处理,错误是没法处理。对象
2、Exceptionblog
通常分为Checked异常和Runtime异常,全部RuntimeException类及其子类的实例被称为Runtime异常,不属于该范畴的异常则被称为CheckedException。内存
①Checked异常
只有java语言提供了Checked异常,Java认为Checked异常都是能够被处理的异常,因此Java程序必须显示处理Checked异常。若是程序没有处理Checked异常,该程序在编译时就会发生错误没法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种
1 当前方法知道如何处理该异常,则用try...catch块来处理该异常。
2 当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
1 package cn.xy.test; 2 3 import java.io.IOException; 4 5 /** 6 * Checked异常测试方法 7 * @author xy 8 * 9 */ 10 public class CheckedExceptionMethods 11 { 12 // 总异常类,既有checkedException又有RuntimeException,因此其中的checkedException必须处理 13 public void method1() throws Exception 14 { 15 System.out.println("我是抛出异常总类的方法"); 16 } 17 18 // 捕获并处理这个异常 19 public void testMethod1_01() 20 { 21 try 22 { 23 method1(); 24 } 25 catch (Exception e) 26 { 27 e.printStackTrace(); 28 } 29 } 30 31 // 把异常传递下去 32 public void testMethod1_02() throws Exception 33 { 34 method1(); 35 } 36 37 public void testMethod1_03() throws Exception 38 { 39 throw new Exception(); 40 } 41 42 public void testMethod1_04() 43 { 44 try 45 { 46 throw new Exception(); 47 } 48 catch (Exception e) 49 { 50 e.printStackTrace(); 51 } 52 } 53 54 // checkedException典型表明IOException 55 public void method2() throws IOException 56 { 57 System.out.println("我是抛出IO异常的方法"); 58 } 59 60 public void testMethod2_01() 61 { 62 try 63 { 64 method2(); 65 } 66 catch (Exception e) 67 { 68 e.printStackTrace(); 69 } 70 } 71 72 public void testMethod2_02() throws Exception 73 { 74 method2(); 75 } 76 77 }
咱们比较熟悉的Checked异常有
Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
java.io.IOException
②RuntimeException
Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。因此由系统自动检测并将它们交给缺省的异常处理程序。固然若是你有处理要求也能够显示捕获它们。
1 package cn.xy.test; 2 3 /** 4 * 运行时异常测试方法 5 * @author xy 6 * 7 */ 8 public class RuntimeExcetionMethods 9 { 10 public void method3() throws RuntimeException 11 { 12 System.out.println("我是抛出运行时异常的方法"); 13 } 14 15 public void testMethod3_01() 16 { 17 method3(); 18 } 19 20 public void testMethod1_02() 21 { 22 throw new RuntimeException(); 23 } 24 }
咱们比较熟悉的RumtimeException类的子类有
Java.lang.ArithmeticException
Java.lang.ArrayStoreExcetpion
Java.lang.ClassCastException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException
3、Error
当程序发生不可控的错误时,一般作法是通知用户并停止程序的执行。与异常不一样的是Error及其子类的对象不该被抛出。
Error是throwable的子类,表明编译时间和系统错误,用于指示合理的应用程序不该该试图捕获的严重问题。
Error由Java虚拟机生成并抛出,包括动态连接失败,虚拟机错误等。程序对其不作处理。