异常:程序运行期(执行期)出现的错误【不是语法错误】,是java提供的一种用于处理程序错误的机制。如:除0溢出,数组下标溢出、读文件不存在。
Java程序执行过程中如出现异常事件,系统自动的生成异常类对象,封装了异常事件的信息并被提交给Java运行时系统,成为‘’抛异常‘’。
当Java运行时系统收到异常时,会寻找能处理这一异常的代码,并把当前异常交给其处理,称为“捕获异常”。
一、异常分类图
Throwable:父类 Error和Exception是两个子类。其中Error指系统异常,比如虚拟机异常,不需要处理。Exception又分为两种,其中Runtime Exception指经常出现的,比如除0溢出等,可以捕获也可以不捕获。其他的就要求必须要捕获,常见的在jdk中看到方法后面跟了throws就必须catch.
public class TestException{ public static void main(String args[]){ int a[]={3,2,5}; //捕获异常 try{ System.out.println(a[3]);} catch(ArrayIndexOutOfBoundsException e){//e是异常对象,当检测到异常的时候会系统自动初始化,交给Catch的代码处理 System.out.println("系统正在维护。。。。"); e.printStackTrace();}//用来跟踪异常事件发生时执行堆栈的内容 }}
二、五个关键字
- try:可能发生异常的语句
- catch:捕获,并处理异常(printStackTrace()用来跟踪异常事件发生时执行堆栈的内容)
- throw:方法内部抛异常
- throws:声明方法异常
- final:代码中无论是否有异常都会执行,清除资源
public void someMethod()throws someException{
if(somecondition)
throw new someException(“错误原因”);
}
try{
someMethod(); //someMethod()方法明确抛异常,所以调用时必须要catch
}
catch(someMethod e)
{
}
try{
}
catch(someException1 e1){
}
try{
}
catch(someException2 e2){
}
finally{
}
执行过程:1.e1->finally
2.e2->finally
3.无异常->finally
三、自定义异常类
步骤:
- 通过继承java.lang.Exception类声明自己的异常类
- 在方法适当的位置生成自定义异常的实例,并用throw语句抛出
- 在方法的声明部分用throws语句声明该方法可能抛出的异常
package Exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
class MyException extends Exception{
private int id;
private String message;
public MyException(String message,int id){
super(message);
this.id=id;
}
public int getID(){
return id; }
}
public class TestException {
public void regist(int i) throws MyException{
if(i<0)
throw new MyException("人数不合法。。",1);
else
System.out.println("num:"+i);
}
public void manger(){
try{regist(-50);}//regist()方法抛异常了,因此必须捕获
catch(MyException e){
System.out.println("操作类型:"+e.getID());
e.printStackTrace();
}
System.out.println("操作结束!");
};
public static void main(String args[])
{
TestException test=new TestException();
test.manger();
}
/*int a[]={3,2,5};
try{
System.out.println(a[3]);}
catch(ArrayIndexOutOfBoundsException e){//e是异常对象,当检测到异常的时候会系统自动初始化
System.out.println("系统正在维护。。。。");
e.printStackTrace();{}*/
}
结果:操作类型:1
操作结束!
Exception.MyException: 人数不合法。。
at Exception.TestException.regist(TestException.java:19)
at Exception.TestException.manger(TestException.java:24)
at Exception.TestException.main(TestException.java:34)