欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java小练_异常

程序员文章站 2022-07-12 08:12:23
...

1.需通过控制台接收用户输入的两个整数,然后做除法。要求用异常处理输入非数字的异常,和除数为0的异常。

private Scanner input;
public double divide() {
    input = new Scanner(System.in);
    System.out.println("请输入第一个整数:");
    int num1 = input.nextInt();//被除数
    return 0;
}

Java小练_异常
非数字异常,用try/catch处理。(注意,实际开发中不处理,这里只是作业练习。)

public class ExceptionHomework1 {
	private Scanner input;
	public double divide() {
		input = new Scanner(System.in);
		while(true) {//提示异常后还需要重新输入操作,所以循环处理
			try {
				System.out.println("请输入第一个整数:");
				int num1 = input.nextInt();//被除数
				System.out.println("请输入第二个整数:");
				int num2 = input.nextInt();//除数  考虑不为0的条件
				if(num2 == 0) {
					throw new ArithmeticException("除数不能为0");
					//遇见throw程序终止,就无法拿到数据,需要进一步处理。
				}
				return num1/num2;
			} catch(InputMismatchException exception) {
				System.err.println("请录入正确格式的数字:");
			}
		}
	}

尝试运行,录入一个字母,发现程序进入死循环。分析原因,程序确实录入了,但是我们录入的字母一直在流里面,程序没有读到字母,再次走程序会一直报输入字母导致的非匹配异常。后续无法继续录入。
Java小练_异常
处理:把录入的非数字的数据提取出来。

catch(InputMismatchException exception) {
    System.err.println("请录入正确格式的数字:");
    //录入非数字的数据一直在流里面,陷入死循环。 数据阻塞
    //把这个异常数据读出来,解决我们循环录入数据的需要。
    input.next();
}

Java小练_异常
除数不能为0的算数异常也用try/catch捕获处理,使程序能够捕获异常后能够重新录入。
Java小练_异常

2.模拟实现用户购买商品的功能,使用数组模拟商品列表,当购买的商品不存在或者商品库存为0时,抛出自定义异常。用户购买某一个商品时,对异常进行处理,并对库存进行改变。

分析过程:
1.需要有一个商品类,用来初始化商品列表信息。
2.需要遍历展示商品界面。
3.用户选择购买后的逻辑处理。
判断库存,处理异常,调整库存。再次遍历展示商品列表。
/*
 * 商品类
 * 属性:ID、名字、单价、库存
 * 方法:set/get访问方法、有参/无参构造
 */
public class Good {
	private int GID;//商品ID
	private String GNAME;//商品名字
	private double GPRICE;//商品单价
	private int GCOUNT;//商品库存
	public int getGID() {
		return GID;
	}
	public void setGID(int gID) {
		GID = gID;
	}
	public String getGNAME() {
		return GNAME;
	}
	public void setGNAME(String gNAME) {
		GNAME = gNAME;
	}
	public double getGPRICE() {
		return GPRICE;
	}
	public void setGPRICE(double gPRICE) {
		GPRICE = gPRICE;
	}
	public int getGCOUNT() {
		return GCOUNT;
	}
	public void setGCOUNT(int gCOUNT) {
		GCOUNT = gCOUNT;
	}
	
	public Good() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Good(int gID, String gNAME, double gPRICE, int gCOUNT) {
		super();
		GID = gID;
		GNAME = gNAME;
		GPRICE = gPRICE;
		GCOUNT = gCOUNT;
	}
}
/*
 * 主界面:
 * 初始化商品数据、遍历显示商品、判断库存,处理异常,调整库存
 */
public class ExceptionHomework2 {
	// 用静态代码块初始化商品数据
	private static Good[] goods;
	private static Scanner input;
	static {
		input = new Scanner(System.in);
		// 创建一个有三个商品的商品库实例
		goods = new Good[3];
		goods[0] = new Good(1, "白T恤", 99, 10);
		goods[1] = new Good(2, "黑T恤", 99, 5);
		goods[2] = new Good(3, "白衬衫", 199, 100);

	}

	// 展示商品列表
	private void goodList() {
		System.out.println("商品ID\t商品名称\t商品库存");
		for (Good good : goods) {
			System.out.println(good.getGID() + "\t" + good.getGNAME() + "\t" + good.getGCOUNT());
		}
	}

	// 购买商品
	public void buyGood() {
		// 展示商品
		goodList();
		System.out.println("请录入要购买的商品ID:");
		int id = input.nextInt();
		Good buyGood = null;
		boolean flag = false;// 初始化一个flag维护流程
		// 考虑:用空抛出空指针异常处理商品不存在的情况,不太合适,可以自定义一个异常处理
		for (Good good : goods) {
			if (id == good.getGID()) {
				buyGood = good;
				flag = true;
				break;
			}
		}
		// 商品不存在的逻辑
		if (!flag) {
			throw new GoodException("您要购买的商品不存在");
		}
		System.out.println("请录入要购买的商品数量:");
		int buyNum = input.nextInt();// 输入要购买的数量
		int goodCount = buyGood.getGCOUNT();// 获取库存中的商品数量赋值给变量goodCount
		if (goodCount == 0) {
			throw new GoodException("商品库存为0,不能购买");
		}
		if (buyNum > goodCount) {// 输入的数量超过库存
			throw new GoodException("商品库存不足,不能购买");
		}
		// 成功购买,商品库存减少
		buyGood.setGCOUNT(goodCount - buyNum);
		System.out.println("购买" + buyNum + "个" + buyGood.getGNAME() + "商品成功,需要支付:" + (buyNum * buyGood.getGPRICE()));
		goodList();// 再次显示商品列表
	}

	public static void main(String[] args) {
		new ExceptionHomework2().buyGood();
	}
}
package com.javasm.exception.exercise;
//自定义异常类,继承Runtime异常处理类,生成有参构造
public class GoodException extends RuntimeException{
	public GoodException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public GoodException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}

	public GoodException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public GoodException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public GoodException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}
}

Java小练_异常
Java小练_异常

<学习内容借鉴于runoob.com,CSDN,https://space.bilibili.com/422389870/等网络资源>

相关标签: Java练习题