day11-Java异常处理

Java 异常处理Exception

不在所有cases中的,导致程序结束允许的是异常。

try-catch程序块 可以在处理异常的同时,不break程序。

try{
  //do things that may go wrong here 可能出错的地方
}catch (Exception e){////object e: information about what happend 出错的情况
  //do things that should happen when somethings went wrong here 出错后执行的操作
}

输入异常Input Exception

关于非有效输入的范围。比如别人占了的格、不存在的格子(又分为超出范围的&输入无效格(仅可输入长度2字符 & 无效字符如Z、标点符号等))。根据给出的图表层级创建类。

不同的用户输入异常类型有:(本次作业中)

  • 已占有:某格存在,但已被一个玩家占有;
  • 超出范围:标识符有效,但超出范围,即过大或过小;
  • 无效的标识符长度:超过2个字符;
  • 无效的标识符字符:行/列符号无效,如:标点符号

遗传

  • 类的遗传分三部分:类名字、属性、方法。
  • 子类由于遗传父类,有父类的所有属性方法(父类一般是更通用general的方法),父类的东西成为子类的一部分。子类能直接用Robot,成为超级类
  • 多态性使用:声明一个Robot,构造时多态化Robo t = new TranslationRobot / Robot = CarrierRobot ,即可实现:父类对象 t = new 某个子类
  • 即使子类无新特性(属性、方法上),也能成为有效的子类。

Super关键字

子类调用父类中的属性、方法、构造函数时,直接用super替代父类中被调用的变量名/函数名。好处是:可以避免因为与子类变量名/方法名重名导致的调用错误。

  1. 子类重写父类方法时,可通过super关键字,调用父类中这个被重写的方法。
  2. super在类的实例化过程(即构造函数中),因指代关系可作为父类的构造函数名使用super(name) == 构造函数Parent(name);
  3. 用super可以引用父类的一个被隐藏的域,比如:【在子类中因为同名而被隐藏的】父类属性变量
  • 注意:父类构造函数被调用的位置,在子类构造函数中必须位于首行。因为子类的构造可能依赖于在父类中初始化得到的域。

构造函数链

  • 如果无第一时间在子类构造中用super调用父类的构造,Java在需要时会自动触发构造链默认调用一个无参数&无函数体的父类构造super()。但如果自己定义构造函数的话,需要提供函数体!
  • 调用构造函数时,会在类型的层次结构中形成一条向上的链。每个构造函数都结束初始化后,分类才开始其初始化进程。
  • "实例化"触发构造函数链,如:调用机器人构造函数时
image-20210228165258787_副本

super的作用主要在下面三种情况下:

1、调用父类被子类重写的方法;

2、调用父类被子类重定义的字段(被隐藏的成员变量);

3、调用父类的构造方法;

其他情况,由于子类自动继承了父类相应属性方法,关键字super可以不显示写出来。

1. super() 的使用实例 一一一子类重写父类的方法

如果在重写的getName方法中我们去调用了父类的相同方法,必须要通过super关键字显示的指明出来。

public class B extends A{
	private String nameB="B";

	@Override
	public void getName() {
		System.out.println("子类"+nameB);
		super.getName();
	}
//打印结果:子类B 父类A

如果不明确出来,按照子类优先的原则,相当于还是再调用重写的getName()方法,此时就形成了死循环,执行后会报java.lang.StackOverflowError异常。如图所示:

img

打印结果为无数个“子类B”。

2. super() 的使用实例 一一一子类重写父类的变量

此时子类B中有一个和父类一样的字段(也可以说成父类字段被隐藏了),为了获得父类的这个字段我们就必须加上super。

如果没有加,直接写成name = name;不会报错,只是会警告,表示此条语句没有任何意义,因为此时都是访问的子类B里面的那么字段。

public class A {	
	 String nameA="A";
}

public class B extends A{
	 String nameA="B";

	public void getName() {
		System.out.println("子类"+nameA);
		System.out.println("父类"+super.nameA);
	}

	public static void main(String[] args) {
		B b=new B();
		b.getName();	
	}
}

PS:我们通过super是不能访问父类private修饰的变量和方法的,因为这个只属于父类的内部成员,一个对象是不能访问它的private成员的。

3. super() 的使用实例 一一一在子类的构造方法中

编译器会自动在子类构造函数的第一句加上 super(); 来调用父类的无参构造器;此时可以省略不写。如果想写上的话必须在子类构造函数的第一句,可以通过super来调用父类其他重载的构造方法,只要相应的把参数传过去就好。

关于构造函数中的super():

在子类的构造方法中,只要里面没有显示的通过super去调用父类相应的构造方法,默认都是调用super(),即无参构造方法,因此要确保父类有相应的构造方法。

  1. ❌父类构造有参,子类构造无自定义构造,默认调用super()

    image-20210301073155543
  2. ❌父类构造有参,子类构造自定义构造,默认调用super()

    image-20210301073235293
  3. ✅父类构造有参,子类构造自定义构造,自行调用有参super(s)

image-20210301073641437

抛出异常 Throwing Exceptions

异常类的继承;构造函数的参数为错误信息;toString()函数输出错误信息。

image-20210301093631164

方法1:try-catch块 + “方法原型后接throws关键字 + _ExceptionName”

  • throws后面可跟多种异常情况。
  • 输出错误种类+具体错误的提示。
下载

或 方法2:仅保留 try中内容 + 两个方法都“原型后接throws关键字 + _ExceptionName”下载 (1)

posted @ 2021-03-01 17:46  吃饭睡觉打代码  阅读(71)  评论(0)    收藏  举报