记住一点:catch是用于处理异常,如果没有catch就代表异常没有被处理过,如果该异常是被检测时异常,那么必须声明;
那么下面这个异常处理的格式通常用来干什么的呢?
Try{
Throw new Exception();
}finally{
//关闭资源
}
在一个函数中,可以涉及了多项操作,以及资源的设计,由于某些需求的原因,异常不能在本函数中进行处理,需要在调用方进行处理,而调用方又不再需要使用对应资源,那么就需要采用以上异常处理格式,将资源进行关闭。
1、子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类;
2、如果父类的方法抛出多个异常,那么子类在覆盖该方法时,只能抛出父类异常的子集;
3、如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常;
如果子类方法发生了异常,就必须要进行try处理,绝对不能抛;
相关代码
package com.javaxl.object; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-05-26 11:54 */ public class ObjectDemo7 { } abstract class ExceptionFu{ public void show() throws AException{ } public void write() throws AException,CException{ } public abstract void eat(); } //覆写show方法声明AException、BException编译通过,声明CException编译不通过 class ExceptionZi1 extends ExceptionFu{ @Override public void show() throws /*AException*/BException { } @Override public void eat() { } } //覆写write方法,可以声明父类所声明的异常的子集 class ExceptionZi2 extends ExceptionFu{ @Override public void write() throws AException,CException { } @Override public void eat() { } } //覆写eat方法,父类定义的函数上没有声明异常,子类也不能有,只能在子类覆写的函数内部做try-catch处理 class ExcZi3 extends ExceptionFu{ @Override public void eat() /*throws CException*/{ } } class AException extends Exception{ } class BException extends AException{ } class CException extends Exception{ }
需求:有一个圆形和长方形,都可以获取面积,对于面积如果出现非法的数值,视为是获取面积出现问题,问题通过异常来表示。
package com.javaxl.object; /** * @author 小李飞刀 * @site www.javaxl.com * @company * @create 2019-05-26 12:05 */ public class ObjectDemo8 { public static void main(String[] args) { // new Rec(3,4).getArea(); // new Circle(6).getArea(); new Rec(3,-4).getArea(); new Circle(-6).getArea(); } } interface Shape{ public void getArea(); } class Rec implements Shape{ private int x; private int y; Rec(int x,int y){ if(x < 0 || y < 0){ throw new NoValueException("长宽不能为负数,出错了!!!"); // System.out.println("长宽不能为负数,出错了!!!"); } this.x = x; this.y = y; } @Override public void getArea() { System.out.println(x * y); } } class Circle implements Shape{ public static final double PI = 3.14; private int r; public Circle(int r) { if(r<0) throw new NoValueException("圆半径不能为负数,出错了!!!"); this.r = r; } @Override public void getArea() { System.out.println(r * r * PI); } } class NoValueException extends RuntimeException{ NoValueException(String msg){ super(msg); } }
该需求完成后,我们要理解两个问题
if else可以处理的问题,为什么要使用异常来处理?
RuntimeException的应用场景?
If else来处理程序的问题,会使得代码非常臃肿,代码的可读性不高。用异常机制来处理的话,可以将正常运行的代码块与非正常运行的代码块分离,try里放的正常逻辑处理的代码块,catch中是非正常运行的代码块。
有些代码在执行过程中出错,没有必要再执行下去了,因为执行下去没有任何意义,执行后的结果肯定是错误的,这个时候我们需要在执行到错误代码的时候让程序停止。就像需求中传入半径为负数,算出的结果没有意义是一样的。
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有