一、概述
异常就是程序运行不正常的情况。也称问题,是现实生活中一个具体的事物,也可以通过java的类的形式来进行描述,并封装成对象。其实就是java对不正常情况描述后的对象体现。
对于问题化分有两种,一种是严重(Errow类),一种是非严重(Exception)类。对于Errow类的问题一般不编写针对性的代码对其进行处理 对于非严重,java用Exception类来描述对于Exception类可以进行针对性的处理方式进行处理无论Errow还是Exception都具有一些共性内容比如不正常的信息、引发原因等。类中的所属关系如下:
throwable
|---Errow
|---Exception
对于异常的处理:jvm提供了特有的异常处理机制
try
{
需要被检测异常代码
}
catch(异常类型 变量)
{
处理异常的代码(处理方式)
}
finally
{
一定会执行的语句
}
class Demo
{
public int div(int a ,int b) throws Exception //在功能上通过throw关键字申明了该功能有可能出现问题
{
return a/b;
}
}
class ExceptionDemo
{
public static void main(String[] args) //throws Exception//可以继续抛出,最后由jvm来处理。但一般自己处理
{
//System.out.println("a/b="+new Demo().div(4,0));//【ArithmeticException: / by zero】
try
{
System.out.println("a/b="+new Demo().div(4,0));
}
catch (Exception e)
{
System.out.println("出错啦!!");
System.out.println("Over");
System.out.println(e.getMessage());// / by zero
System.out.println(e.toString());//异常名:异常信息
e.printStackTrace();//异常名 异常信息 异常位置
//其实jvm默认的异常处理机制,就是调用printStackTrace方法,打印异常的堆栈跟踪信息
}
}
}
二、对多异常处理:
1.申明异常时,建议申明更为具休的异常,这样处理起来更为具体。
2.对方申明几个异常,就对应几个catch块,不要定义多余的catch块
如果多个catch块出现继承关系,那么把父类块放在最下面
建议在处理catch块时,catch中一定要有具体处理方式
不要简单定一句e.printStackTrice()
也不要简单书写一条语句。
class Demo
{
public int div(int a ,int b) throws ArithmeticException,ArrayIndexOutOfBoundsException//在功能上通过throw关键字申明了该功能有可能出现问题
{
int [] arr = new int[a];
System.out.println(arr[4]);
return a/b;
}
}
class ExceptionDemo2
{
public static void main(String[] args) //throws Exception//可以继续抛出,最后由jvm来处理。但一般自己处理
{
//System.out.println("a/b="+new Demo().div(4,0));//【ArithmeticException: / by zero】
try
{
System.out.println("a/b="+new Demo().div(4,0));
}
catch (ArithmeticException e)
{
System.out.println("出错啦!!");
System.out.println("Over");
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("角标越界啦!!");
System.out.println("Over");
}
catch (Exception e)//多态
{
System.out.println("出错啦!!");
System.out.println("Over");
}
}
}
三、自定义异常
因为项目中会出现特有问题,而这些问题并java所描述并封装。所以对于这些特有问题可以按照java的对问题的封装的思想,将特有的问题进行自定义异常的封装。
当在函数内部出现了throw抛出异常对象,那么必须给出相应处理动作,不然编译会出错。要么在在函数内部try catch处理,要么在函数上申明让调用者处理一般情况函数内部出现异常,在函数上申明。自定义异常必须是自定义类继承Exception。
继承Exception的原因:异常体系有个特点,因为异常类和异常对你都被抛出它们都具备可抛性,这个可抛性是throwable中特有的特点只有这个体系中的类和对象才能被throw和throws所操作
throw 和throws的区别:
throws用在函数上,throw用在函数内;
throws 后面跟异常类,可以跟多个类,用逗号隔开;
throw后面跟的是异常对像;
class FushuException extends Exception
{
private int value ;
/*
private String msg;
FushuException(String msg)
{
this.msg = msg ;
}
public String getMsg()
{
return msg;
}
*/
FushuException(String msg,int value)
{
super(msg);//因为父类中已经把异常信息的操作都已经完成了,所以只需将信息传给父类就行。
this.value = value;
}
public int getValue()
{
return value;
}
}
class Demo
{
public int div(int a,int b) throws FushuException
{
if(b<0)
{
throw new FushuException("除数不能为负数",b);
}
return a/b;
}
}
class ExceptionDemo3
{
public static void main(String[] args)
{
Demo d = new Demo();
try
{
int x = d.div(4,-1);
System.out.println(x);
}
catch (FushuException e)
{
System.out.println(e.toString());
//FushuException x = new FushuException();
//System.out.println(e.getMsg());
System.out.println("错误的负数是:"+e.getValue());
}
}
}