------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
五、异常及处理
关于异常信息的定义
因为父类中已经把异常信息操作完成了,所以子类只需要在构造时将异常信息传递给父类,通过super语句。那么就可以直接通getmessage方法获取过自定义的异常。
自定义异常需要注意的
必须是自定义类继承exception
继承Exception的原因:
因为异常类和异常对象都需要被抛出,他们都具有可抛性,这个可抛性是Throwable这个体系独有特性。这有这个体系中的类和对象可以被throw和throws操作。
throw和throws的区别:
hrows在函数上,throw使用在函数内,throws后面跟的异常类,可以跟多个,用逗号隔开,throw后面跟的是异常对象。
Exception中有一个特殊的异常类 RuntimeException运行异常,如果在函数内抛出该异常,函数可以不用声明,编译一样通过,如果在函数上声明了该异常类,调用者可以不用处理,编译一样通过,所以不用在函数中声明,是因为不需要让调用者处理,当该异常发生时,希望程序停止,因为只运行时出现了无法继承运算的请况,希望停止程序后对代码进行修正。
对于异常分2种:
1 编译时被检测出来的异常。
2 编译时不检测异常,在运行时有异常一般是 RuntimeException和期子类。
finally代码块:定义一定执行的代码,通常用于关闭资源。
记住一点:catch是用于处理异常的,如果没有catch,就代表异常没有被处理,如果该异常是检测内异常,该异常必须先声明。
异常在子类覆盖中的体现:
1 子类在覆盖父类时如果父类的方法抛出异常,那么子类的覆盖方法只能抛出父类异常,或者该异常的子类。
2 如果父类方法抛出多个异常,那么子类在抛出方法时,只能抛出父类的异常子类。
3 如果父类或者借口的方法中没有异常抛出,那么子类在覆盖方法时也不可以抛出异常,如果子类方法发生了异常,就必须进行try处理,绝对不能抛出。
下面是几个异常的例子:
//除零异常,不做处理
class test{
int devide(int x,int y)
{return x/y;}
}
class TestException{
public static void main(String arg[])
{
new test().devide(3,0);
System.out.println("the end!!");
}
}
//除零异常,进行捕获
class test{
int devide(int x,int y)
{return x/y;}
}
class CatchException{
public static void main(String arg[])
{
try{
new test().devide(3,0);
}
catch(ArithmeticException l)//exception类 声名 对象l
{//catch中可以执行其他语句输出
// l.printStackTrace() ;//printStackTrace
// public void printStackTrace(PrintWriter s)
// 将此 throwable 及其追踪输出到指定的 PrintWriter。
//参数:
//s - 用于输出的 PrintWriter
//System.out.println(l.getMessage());//getMessage
// public String getMessage()
//返回此 throwable 的详细消息字符串。
//返回:
//此 Throwable 实例(可以为 null)的详细消息字符串。
System.out.println("出错拉!!类型是:ArithmeticException");
}
System.out.println("the end!!");
}
}
//除零异常,抛出异常
class test {
int devide(int x,int y)throws Exception//方法抛出异常!1抛给主调方法
{return x/y;}
}
class TestException {
public static void main(String arg[])throws Exception//主调方法不愿处理,又抛给了处理机!!
//如想处理的话,
//请参照CatchException中主函数的异常捕获!!
{
new test().devide(3,0);
System.out.println("the end!!");
}
}