记住一点: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晓码阁 版权所有