练习题
计算器接口具有work方法,功能是运算,有一个手机类Cellphone, 定义方法testWork 测试计算功能,调用计算接口的work方法, 要求调用CellPhone对象的testWork方法,使用上匿名内部类
package eunm;
public class dd {
public static void main(String[] args) {
Cellphone cellphone = new Cellphone();
cellphone.testWork(new ICalculate() {
@Override
public double work(double n1, double n2) {
return n1 + n2;
}
}, 34, 2);
cellphone.testWork(new ICalculate() {
@Override
public double work(double n1, double n2) {
return n1+n2;
}
},23,14);
}
}
interface ICalculate{
//work方法是完成计算,怎么完成计算是匿名内部类完成
public double work(double n1, double n2);
}
class Cellphone{
//当调用testWork方法 直接传入一个实现了ICalculate接口的匿名内部类即可
public void testWork(ICalculate iCalculate,double n1, double n2){
double result = iCalculate .work(n1, n2);//动态绑定
System.out.println(result);
}
}
1.有一个父迎工具接口类Vehicles
2.有Horse类和Boat类分别实现Vehicles
3.创建交通工具工厂类,有两个方法分别获得交通工具Horse和Boat
4.有Person类, 有name和Vehicles属性, 在构造器中为两个属性赋值
5.实例化Person对象”唐僧”,要求般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具
package eunm;
public class EnumDetail {
public static void main(String[] args) {
//5.实例化Person对象"唐僧”,要求一般情况下用Horse作为交通工具,遇到大河时用Boat作为交通工具
Person person = new Person("唐僧", new Horse());//
person.passRiver();
person.passRode();
person.passRiver();
person.passRiver();
person.passRiver();
person.passRode();
person.pssAir();
}
}
//1.有一个交通工具接口类Vehicles
//2.有Horse类和Boat类等分别实现Vehicles
interface Vehicles {
public void work();
}
class Horse implements Vehicles {
@Override
public void work() {
System.out.println("ma");
}
}
class Boat implements Vehicles {
@Override
public void work() {
System.out.println("chuang");
}
}
class Airport implements Vehicles {
@Override
public void work() {
System.out.println("feiji");
}
}
//3.创建交通工具工厂类,有两个方法分别获得交通工具Horse和Boat等
class AAA {
//需求=》马儿始终是同一匹
//饿汉式
//1 类的内部直接创建对象
private static Horse horse = new Horse();//
//2 构造器私有化
private AAA() {
}
//3 向外暴露一个静态的公共方法 返回对象
public static Horse getHorse() {
return new Horse();
}
public static Boat getBoat() {
return new Boat();
}
public static Airport getAirport() {
return new Airport();
}
}
//4.有Person类, 有name和Vehicles属性,在构造器中为两个属性赋值
class Person {
private String name;
private Vehicles vehicles;
public Person(String name, Vehicles vehicles) {
this.name = name;
this.vehicles = vehicles;
}
//把具体要求封装成方法
public void passRiver() {
//如何不浪费 在构建对象传入的交通工具对象
//vehicles instanceof Boat 是判断当前的vehicles 是不是Boat
//(1) vehicles = null : vehicles instanceof Boat => false
//(2) vehicles =马对象: vehicles instanceof Boat => false
//(3) vehicles =船对象: vehicles instanceof Boat => true
if (!(vehicles instanceof Boat)) {
//向上转型 多态
vehicles = AAA.getBoat();
}
//使用接口调用
vehicles.work();
}
public void passRode() {
//vehicles instanceof Horse 是判断当前的vehicles 是不是Horse
if (!(vehicles instanceof Horse)) {
//向上转型 多态
vehicles = AAA.getHorse();
}
//使用接口调用
vehicles.work();
}
public void pssAir() {
if (!(vehicles instanceof Airport)) {
//向上转型 多态
vehicles = AAA.getAirport();
}
//使用接口调用
vehicles.work();
}
}
异常
执行过程中所发生的异常事件可分为两大类
-
Error(错误): Java虚拟机无法解决的严重问题。如: JVM系统内部错误、资源 耗尽等严重情况。比如: StackOverflowError[栈溢出]和OOM(out of memory), Error 是严重错误,程序会崩溃。
-
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针 对性的代码进行处理。例如空指针访问,试图读取不存在的文件,网络连接中 断等等,Exception 分为两大类:运行时异常[程序运行时,发生的异常]和编 译时异常[编程时,编译器检查出的异常]。
异常体系图


异常处理


================================================================

try-catch异常处理

1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.
2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等) 则使用如下代码- finally { }
package eunm.Try;
public class TryCatch {
public static void main(String[] args) {
/*
1)如果异常发生了,则异常发生后面的代码不会执行,直接进入到catch块.
2)如果异常没有发生,则顺序执行try的代码块,不会进入到catch.
3)如果希望不管是否发生异常,都执行某段代码(比如关闭连接,释放资源等)
则使用如下代码- finally { }
*/
//快捷键ctrl+alt+t
try {
String str = "1ewtwe4atg";
int a = Integer.parseInt(str);
System.out.println("数字" + a);
} catch (NumberFormatException e) {
System.out.println("异常信息" + e.getMessage());
} finally {
System.out.println("finally代码块继续执行");
}
System.out.println("程序继续");
}
}
//1.如果try代码块有可能有多个异常
//2. 可以使用多 个catch分别捕获不同的异常, 相应处理
//3.要求子类异常道在前面,父类异常写在后面
package eunm.Try;
public class TryCatch01 {
public static void main(String[] args) {
//1.如果try代码块有可能有多个异常
//2. 可以使用多 个catch分别捕获不同的异常, 相应处理
//3.要求子类异常道在前面,父类异常写在后面
try {
Person person = new Person();
person = null;
System.out.println(person.getName());//NullPointerException
int n1 = 10;
int n2 = 0;
int res = n1 / n2;//ArithmeticException
} catch (NullPointerException e) {
System.out.println("空指针异常" + e.getMessage());
} catch (ArithmeticException e) {
System.out.println("算术异常" + e.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
}
}
}
class Person {
private String name = "fa";
public String getName() {
return name;
}
}
1)如果没有出现异常,则执行try块中所有语句,不执行catch块中语句,如 果有finally,最后还需要执行finally里面的语句
2)如果出现异常,则try块中异常发生后,try块剩下的语句不再执行。将执 行catch块中的语句,如果有finally,最后还需要执行finally里面的语句
练习题
如果用户输入的不是一个整数,就提示他反复输入,直到输入一个整数为止
package eunm.Try;
import java.util.Scanner;
public class Excercise {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);//1 创建Scanner对象接收
int a = 0;
//2.使用无限循环,去接收一个输入
do {
System.out.println("请输入一个整数");
String inputstr = scanner.next();//把当作一个字符串接收输入
try {
//3.然后将该输入的值,转成一个int
a = Integer.parseInt(inputstr);//4.如果在转换时,抛出异常,说明输入的内容不是个可以转成int的内容
break;
} catch (NumberFormatException e) {//5. 如果没有抛出异常,则break 该循环
System.out.println("你输的不是整数");
}
} while (true);
System.out.println("你输入的值是" + a);
}
}
public void f2() throws Exception {
/*
创建一个文件流对象
1. 这里的异常是个FiLeNotFoundException 编译异常
2. 使用前面讲过的try-catch-finally
3. 使用throws ,抛出异常,让:调用f2方法的调用者(方法)处理
4. throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类
5. throws 关键字后也可以是异常列表,即可以抛出多个异常
*/
FileInputStream fis = new FileInputStream("d:aa.txt");
}
细节
1)对于编译异常,程序中必须处理,比如try-catch或者throws
2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理
3)子类重写父类的方法时,对抛出异常的规定:子类重写的方法,所抛出的异常类型要 么和父类抛出的异常一致,要么为父类抛出的异常的类型的子类型
4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必 throws
细节:



练习题
编写应用程序,接收命令行的两个参数(整数),计算两数相除。 计算两个数相除,要求使用方法cal(int n1, int n2) 对数据格式不正确(NumberformatException)、缺少命令行参数 (ArrayIndexOutOfBoundsException)、除0进行异常处理(ArithmeticException)。
package eunm.Throws;
public class aa {
public static void main(String[] args) {
try {
//先验证输入的参数个数是否正确
if (args.length != 2) {
throw new ArrayIndexOutOfBoundsException("参数个数不对");
}
//先把接收到的参数转成整数
int n1 = Integer.parseInt(args[0]);
int n2 = Integer.parseInt(args[1]);
double res = cal(n1, n2);//该方法可能抛出ArithmeticException
System.out.println("计算结果" + res);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println(e.getMessage());
} catch (NumberFormatException e) {
System.out.println("参数格式不正确需要输出整数");
} catch (ArithmeticException e) {
System.out.println("出现了除0的异常");
}
}
public static double cal(int n1, int n2) {
return n1 / n2;
}
}
原文始发于微信公众号(易小琳):异常|异常体系图|练习题
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/251510.html