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;
}
非数字异常,用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("请录入正确格式的数字:");
}
}
}
尝试运行,录入一个字母,发现程序进入死循环。分析原因,程序确实录入了,但是我们录入的字母一直在流里面,程序没有读到字母,再次走程序会一直报输入字母导致的非匹配异常。后续无法继续录入。
处理:把录入的非数字的数据提取出来。
catch(InputMismatchException exception) {
System.err.println("请录入正确格式的数字:");
//录入非数字的数据一直在流里面,陷入死循环。 数据阻塞
//把这个异常数据读出来,解决我们循环录入数据的需要。
input.next();
}
除数不能为0的算数异常也用try/catch捕获处理,使程序能够捕获异常后能够重新录入。
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
}
}
<学习内容借鉴于runoob.com,CSDN,https://space.bilibili.com/422389870/等网络资源>
上一篇: gradle使用maven库设置
下一篇: 11.判断一个人出生了多少天