class FuShuException extends Exception
{
//private String msg;
private int value;
FuShuException(String msg,int value)
{
super(msg);
this.value=value;
//this.msg=msg;
}
public int getValue()
{
return value;
}
}
class Demo
{
int div(int a,int b) throws FuShuException
{
if(b<0)
throw new FuShuException("出现了除数是负数的情况---- /by fushu",b);//手动通过throw关键字抛出一个自定义异常对象。
return a/b; //new ArithmeticException
}
}
class ExceptionDemo3
{
public static void main(String[] args)
{
Demo d=new Demo();
try
{
int x=d.div(4,-53535);
System.out.println(x);
}
catch (FuShuException e)
{
System.out.println(e.toString());
System.out.println("错误的负数是:"+e.getValue());
//System.out.println("除数出现负数了");
}
System.out.println("over");
}
}
当在函数内部出现了throw抛出异常对象,那么就必须要给对应的处理动作。
要么在内部try catch处理,要么在函数上声明让调用者处理。
一般情况下,在函数内出现异常,函数上需要声明。
如何自定义异常信息:
因为父类中已经把异常信息的操作都完成了。所以子类只有在构造时,经异常信息传递给父类,通过super语句。那么就可以直接通过getMessage方法获取自定义的异常信息。
自定义异常:必须是自定义类继承Exception。
继承Exception原因:
异常体系有一个特点:因为异常类和异常对象都被抛出。
它们都具备可抛性,这个可抛性是Throwable这个体系中独有的特点。
只有这个体系中的类和对象才可以被throws和throw操作。
throw和throws的区别:throws使用在函数上,throw使用在函数内。
throws后面跟的是异常类,可以跟多个,用逗号隔开。
throw后面跟的是异常对象。
Exception中有一个特殊的子类异常RuntimeException:运行时异常。
如果在函数内抛出该异常,函数上可以不用声明,编译一样通过。
如果在函数上声明了该异常,调用者可以不用进行处理,编译一样通过。
之所以不用在函数声明,因为不需要让调用者处理。
当该异常发生时,希望程序停止;因为在运行时,出现了无法继续运算的情况,希望停止程序后,对代码进行修正。
自定义异常时:如果该异常的发生,无法再继续进行运算,就让自定义异常继承RuntimeException。
class FuShuException extends RuntimeException
{
FuShuException(String msg)
{
super(msg);
}
}
class Demo
{
int div(int a,int b)
{
if(b<0)
throw new FuShuException("出现了除数为负数了");
if(b==0)
throw new ArithmeticException("除数为零了");
return a/b;//new ArithmeticException
}
}
class ExceptionDemo4
{
public static void main(String[] args)
{
Demo d=new Demo();
int x=d.div(4,-9);
System.out.println(x);
System.out.println("over");
}
}
异常在子父类覆盖中的体现:
1, 子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类的异常或者该异常的子类。
2, 如果父类的方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集。
3, 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。
如果子类方法发生了异常,就必须要进行try处理,绝对不能抛。
异常练习:
/*
有一个圆形和长方形
都可以获取面积。对于面积如果出现非法的数值,视为是获取面积出现问题。
问题通过异常来表示。
对这个程序进行基本设计。
*/
class NoValueException extends RuntimeException
{
NoValueException(String message)
{
super(message);
}
}
interface Shape
{
void getArea();
}
class Rec implements Shape
{
private int len,wid;
Rec(int len,int wid)//throws NoValueException
{
if(len<=0||wid<=0)
throw new NoValueException("出现非法值");
this.len=len;
this.wid=wid;
}
public void getArea()
{
System.out.println(len*wid);
}
}
class Circle implements Shape
{
private int r;
public static final double PI=3.14;
Circle(int r)//throws NoValueException
{
if(r<=0 )
throw new NoValueException("出现 非法值");
this.r=r;
}
public void getArea()
{
System.out.println(PI*r*r);
}
}
class ExceptionTest1
{
public static void main(String[] args)
{
Rec r=new Rec(4, -2);
r.getArea();
Circle c=new Circle(-8);
c.getArea();
System.out.println("over");
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |