一、初始异常体系
异常定义在 java.lang.throwable下 分为 Error 和 Exception
error: 代表系统级别的错误(属于严重的错误),而我们开发人员不需要管他。
Exception: 叫做异常(是异常体系中最顶层的父类),代表程序可能出现的问题。我们通常会用Exception以及他的子类来封装程序出现的问题。
Exception又分为俩类: 运行时错误 和 编译时错误。
运行时错误:
RuntimeExceotion以及其子类,编译时不会出现异常提醒,运行时才会出现的错误。
编译时错误:
除了运行时错误的其他错误被称为编译时错误,编译阶段就会出现的错误。(作用在于提醒程序员)
二、异常的作用及底层默认处理方式
异常主要有俩个作用:
1、异常可以用来查看bug的关键参考信息
System.out.println(2/0); //Exception in thread "main" java.lang.ArithmeticException: / by zero //at Tset1.tset.main(tset.java:5)
2、异常可以作为方法内部的一种特殊返回值,已通知调用者底层的执行情况
public void setName(String name) { int len = name.length(); if(len<3||len>10){ throw new NameFormatException("格式有误,长度应为:3-10");//将错误返回 } this.name = name; }
JVM默认处理方式
1、把异常的名称,异常的原因及异常出现的位置等信息输出在控制台。
2、程序将停止运行,异常下面的代码就不会执行了。
三、异常的处理
一、捕获异常
格式
try{ //可能出现错误的代码 }catch{ //异常的处理代码 } //一个try可以对应多个catch
示例
public class tset { public static void main(String[] args) { int arr[] = {1,2,3,4,5,6}; try { System.out.println(arr[10]); /*此处出现了异常,程序就会在这里创建一个ArrayIndexOutOfBoundsException对象 拿着这个对象到catch的小括号中对比,看括号中的变量是否可以接受 如果被接受,就表示该异常被捕获,执行catch中的代码 执行完之后,不会停止,会继续执行下面的代码 */ }catch (ArrayIndexOutOfBoundsException e){ System.out.println("索引越界了");//如何处理该异常 } System.out.println("我也执行了") } }
二、捕获异常的注意事项
1、如果try中没有遇到问题,则会把try中的所有代码执行完毕,而不会执行catch中的代码。
2、如果try中的代码可能出现多个问题,则需要写多个catch与错误相对应。(如果catch中的对象使用多态,则应将父类型放在子类型的下面,否则子类型将永远无法捕获异常)。
例如
int arr[] = {1,2,3,4,5,6}; try { System.out.println(arr[10]); System.out.println(2/0); }catch (ArrayIndexOutOfBoundsException e){ System.out.println("索引越界了");//如何处理该异常 }catch(RuntimeException e){ System.out.println("666"); }//RuntimeExceptionArrayIndexOutOfBoundsException的父类,需要写在下面。
3、如果try中遇到了问题,下面的代码将不会在执行了。直接就去寻找与catch小括号中相对应的变量了。
4、如果try中的异常没有被catch捕获,则会交给JVM处理。
5、捕获处理异常相对比默认处理的好处
捕获处理不会立刻停止程序的运行,而默认处理会停止程序的运行。
Throwable中的成员方法
大部分的异常类都直接或间接的继承了Throwable类。
public String getMessage()//返回throwable的详细信息的字符串。 public String toSting()//返回此处可抛出的简短描述 public void printStackTrace()//把异常的错误信息输出在控制台上。 (该方法最为常见)
抛出异常
throws关键字
写在方法的定义处,表示声明一个异常,告诉调用者,使用本方法可能会出现的问题。
public void 方法()throws 异常类名1,异常类名2...{ .... }
throw关键字
写在方法里面,结束方法,手动抛出异常,交给调用者。
(注意)方法中下面的方法将不会在执行。
public void 方法(){ throw new NullPointerException(); }
注意:运行时异常一般可以不声明异常,而编译时异常必须声明异常
自定义异常类型
步骤:
1、定义异常类
2、写继承关系//一般继承RuntimeException
3、空参构造
4、带参构造//为了让控制台的报错信息更详细
示例
public class AgeOutofBoundsException extends RuntimeException{//写继承关系 public AgeOutofBoundsException(String message) { super(message); }//带参构造 public AgeOutofBoundsException() { }//空参构造 }