Java的异常是通过5个关键字来实现的:try(执行可能产生异常的代码),catch(捕获异常),finally(无论是否发生异常,代码总能执行),throw(声明方法可能要抛出的各种异常),throws(手动抛出异常)
捕获异常,声明异常,抛出异常
三种情况:1.没有出现异常
- 出现异常:try→产生异常对象→异常匹配类型→进入catch块→程序继续执行
3.异常类型不匹配:try→产生异常对象→异常类型不匹配→异常中断执行
printStackTrace的堆栈跟踪功能显示出程序运行到当前类的执行流程。
在try-catch块后加入finally
1.是否发生异常都执行
2.不执行的唯一情况:有异常,catch块有System.exit(1),中断程序,退出Java虚拟机
存在return的try-catch-finally块:出现异常:try→产生异常对象→异常匹配类型→进入catch块→执行finally块→执行return退出方法
多重catch块:
引发多种类型的异常:1.排列catch语句的顺序:先子类后父类;2.发生异常时按顺序逐个匹配;3.只执行第一个与异常类型匹配的catch语句。
声明异常,在一个方法中抛出了异常,如何通知调用者
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常:
接口:实现防盗门的功能:将门定义为抽象类,锁定义为接口,防盗门继承门,实现锁的借口。
Interface修饰接口,对于接口当中所有方法都是public abstract,所以可以省略。
接口的特性:1.不可以被实例化 2.实现类必须实现接口的所有方法 3.实现类可以实现多个接口,由此实现多继承 4.接口中的变量都是静态常量 5 接口之间可以通过extends实现继承关系,一个接口可以继承多个接口,但接口不能继承类。
根据需求设计方法,实现所有方法,用多态的方式使用
接口是一种能力,关心实现类有何能力,而不关心类的实现细节。
作业:
1.请说明下面的代码中存在什么问题,该如何解决。
public interface Utility {
}
public class Phone implements Utility {
void use(){
System.out.println("using phone");
}
}
public class Test {
public static void main(String[] args) {
Utility util = new Phone();
util.use();
}
}
util.use();出错,父类直接调用了子类特有的方法,而父类中并没有该方法。
将Utility util = new Phone();改成Phone p = new Phone();即可,再调用sue()方法。
2.阅读如下代码,指出其中存在的错误,并说明其原因。
public interface Constants {
int MAX = 100000;
int MIN = 1;
}
public class Test {
public static void main(String[] args) {
Constants con = new Constants();//不能实例化接口
System.out.println(con.MAX);//不能实例化后调用属性
int i = 50;
if(i>Constants.MAX){//不能用接口名调用属性
Constants.MAX = i;//全局静态常量不能被修改
}
}
}
3.阅读如下Java代码,给出运行结果。
public interface Animal {
void shout();
}
public class Cat implements Animal {
@Override
public void shout() {
System.out.println("M M!");
}
}
public class Dog implements Animal {
@Override
public void shout() {
System.out.println("w w!");
}
}
public class Stores {
public static Animal get(String choice){
if(choice.equalsIgnoreCase("dog")){
return new Dog();
}else{
return new Cat();
}
}
}
public class AnimalTest {
public static void main(String[] args) {
Animal a1 = Stores.get("dog");
a1.shout();
}
}
运行结果:
w w!
4.在第三题的基础上进行功能扩展,要求如下。
增加一种新的动物类型:Pig(猪),实现shout()方法。
修改Store类的get()方法:如果传入的参数是字符串dog,则返回一个Dog对象;如果传入的参数是字符串pig,则返回一个Pig对象;否则,返回一个Cat对象。
在测试类Test中加以测试:向Store类的get()方法中传入参数“pig”,并在返回的对象调用shout()方法,看看与预期的结果是否一致。
1 public class Pig implements Animal { 2 @Override 3 public void shout() { 4 System.out.println("h h!"); 5 } 6 }
1 public class Stores { 2 public static Animal get(String choice){ 3 if(choice.equalsIgnoreCase("dog")){ 4 return new Dog(); 5 }else if(choice.equalsIgnoreCase("pig")){ 6 return new Pig(); 7 }else{ 8 return new Cat(); 9 } 10 } 11 }
1 public class AnimalTest { 2 3 public static void main(String[] args) { 4 Animal a1 = Stores.get("pig"); 5 a1.shout(); 6 } 7 }
5.对贯穿本书的案例电子宠物系统的类结构进行重构,要求如下。
定义Eatable接口,在接口中定义eat()方法,表示吃饭功能。
定义FiyingDiscCatchable接口,在接口中定义catchingFiyDisc()方法,表示接飞盘功能。
定义Swimmable接口,在接口中定义swim()方法,表示游泳功能。
定义抽象类Pet,包括宠物名称(name),健康值(health)和与主人亲密度(love)属性,并提供抽象类方法print(),用来输出宠物信息。
定义狗类Dog,继承Pet类,实现Eatable、FlyDiscCatchable接口,并重写或实现各个方法。
定义企鹅类Penguin和继承Pet,实现Eatable和Swimmable接口,并重写或实现各个方法。
编写测试类,实现狗吃饭,企鹅游泳和狗玩接飞盘游戏的功能,并输出企鹅信息。
1 public interface Eatable { 2 /** 3 * 吃饭功能 4 */ 5 void eat(); 6 } 7 8 public interface FiyingDiscCatchable { 9 /** 10 * 接飞盘 11 */ 12 void catchingFiyDisc(); 13 14 } 15 16 public interface Swimmable { 17 /** 18 * 游泳方法 19 */ 20 void swim(); 21 22 }
1 public abstract class Pet { 2 protected String name; 3 protected int health; 4 protected int love; 5 6 7 public Pet(String name, int health, int love) { 8 super(); 9 this.name = name; 10 this.health = health; 11 this.love = love; 12 } 13 public String getName() { 14 return name; 15 } 16 public void setName(String name) { 17 this.name = name; 18 } 19 public int getHealth() { 20 return health; 21 } 22 public void setHealth(int health) { 23 this.health = health; 24 } 25 public int getLove() { 26 return love; 27 } 28 public void setLove(int love) { 29 this.love = love; 30 } 31 public abstract void print(); 32 33 }
1 public class Dog extends Pet implements Eatable, FiyingDiscCatchable { 2 3 4 5 public Dog(String name, int health, int love) { 6 super(name, health, love); 7 } 8 9 @Override 10 public void catchingFiyDisc() { 11 System.out.println("我在接飞盘..."); 12 13 } 14 15 @Override 16 public void eat() { 17 System.out.println("我在吃饭饭..."); 18 19 } 20 21 @Override 22 public void print() { 23 System.out.println("宠物的自白:"); 24 System.out.print("我的名字叫"+super.getName()+",健康值为"+super.getHealth() 25 +",和主人的亲密度是"+super.getLove()); 26 27 } 28 29 } 30 31 public class Penguin extends Pet implements Eatable,Swimmable{ 32 33 public Penguin(String name, int health, int love) { 34 super(name, health, love); 35 } 36 37 @Override 38 public void swim() { 39 System.out.println("我在游泳..."); 40 41 } 42 43 @Override 44 public void eat() { 45 System.out.println("我在吃饭饭..."); 46 47 } 48 49 @Override 50 public void print() { 51 System.out.println("宠物的自白:"); 52 System.out.print("我的名字叫"+super.getName()+",健康值为"+super.getHealth() 53 +",和主人的亲密度是"+super.getLove()); 54 55 } 56 57 } 58 59 public class Test { 60 61 public static void main(String[] args) { 62 Dog d=new Dog("多多",60,3); 63 d.eat(); 64 d.catchingFiyDisc(); 65 Penguin p = new Penguin("落落",60,5); 66 p.swim(); 67 p.print(); 68 69 } 70 71 }