在程序运行期间,出现了不正常的情况,统称为异常。
java对异常做了分类,所有的异常的根为java.lang.Throwable,Throwable下又派生了2个子类,分别是Error和Exception
Error:一般是指和虚拟机相关的问题。如内存溢出,操作系统出错,虚拟机错误等。对于这类错误导致的应用程序中断,仅靠程序本身无法恢复和预防,建议让程序终止Exception:在程序中可以通过代码的形式捕获且可能恢复,遇到这种异常,应该尽可能处理异常,使程序恢复正常运行。Exception类中分为运行时异常(RuntimeException)和受检查的异常(CheckedException)。 运行时异常(RuntimeException):编译能通过,程序不会处理这类异常,但是程序一运行就会终止。 受检查的异常(CheckedException):编译不能通过,程序员必须显示用try...catch处理或用throws声明继续抛给上层调用方法处理 ,该程序在编译时就会发生错误无法编译,这体现了java的设计哲学:没有完善错误处理的代码根本没有机会被执行。
程序示例:
public abstract class Demo03 { public static void main(String[] args) { try{ System.out.println(8/0); System.out.println("123"); }catch(Exception e) { System.out.println("异常已被捕获"); }finally { System.out.println("finally到此一游"); } } }输出结果:
1) ArithmeticException 数学异常 2) OutofMemoryError 内存超界异常 3) ArrayIndexOutOfBoundsException 数组下标越界异常 4) NullPointerException 空指针异常 5) ArrayStoreException 数组存储异常(数组斜变) 6) StringIndexOutOfBoundsException 字符串下标越界异常 7) NumberFormatException 数字格式化异常 8) Iillegal ArgumentException非法情节异常 9) InputMismatchException 输入不匹配异常
代码示例:
public abstract class Demo03 { public static void main(String[] args) { try{ /*int[] a=new int[7]; a[-1]=3;*/ /*String str=null; str.charAt(0);*/ /*String s="abc"; s.charAt(4);*/ /*String[] s2=new String[8]; Object[] b=s2; b[0]=1;*/ String ss="123a"; int num=Integer.parseInt(ss); System.out.println(8/0); }catch(ArrayIndexOutOfBoundsException e) { System.out.println("数组下标越界异常"); }catch(NullPointerException e) { System.out.println("空指针异常"); }catch(StringIndexOutOfBoundsException e) { System.out.println("字符串下标越界异常"); }catch( ArrayStoreException e) { System.out.println("数组存储异常"); }catch( NumberFormatException e) { System.out.println("数字格式化异常"); }catch(Exception e) { System.out.println("异常已被捕获"); } } }手动引发异常不是没事找事,是有原因的,是因为系统内置的异常类不能完全满足我们的要求 。
public abstract class Demo03 { public static void main(String[] args) { String blood="f";//血型 blood=blood.toUpperCase(); if(blood.equals("A")||blood.equals("B")||blood.equals("O")||blood.equals("AB")){ System.out.println("你是一个正常人"); }else{ throw new RuntimeException("血型判断出错"); } } }输出结果:
throw:throw用在方法体内,表示具体向外抛出异常的动作,它抛出的是一个异常的实例,由该方法的调用者进行异常的处理,执行throw一定是抛出了某种异常。
throws:throws用在方法声明后,主要声明这个方法会抛出某种类型的异常,让它的使用者知道,需要捕获的异常的类型,表示出现这一种异常的可能性,并不一定会发生这种异常。
final:用来声明属性的不可变,方法不可覆盖,类不可继承。
finally:是异常处理语句的一部分,表示总是执行。
finalize:是Object类的一个方法,当垃圾收集确定没有对该对象的更多引用时,由对象上的垃圾收集器调用。