Java基础——项目一 家庭收支记账软件
需求:
代码一:

import java.util.InputMismatchException; import java.util.Scanner; /** * @author FREZXX * @create 2021-05-20 11:42 */ public class FamilyAccount { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); boolean flag = true; int[] check = new int[20]; String[] reason = new String[20]; int i = 0; while(flag){ System.out.println("-----------------家庭收支记账软件-----------------"); System.out.println(); System.out.println(" 1.收支明细"); System.out.println(" 2.登记收入"); System.out.println(" 3.登记支出"); System.out.println(" 4.退 出"); System.out.println(); System.out.println(" 请选择(1-4):_"); try { switch (scanner.nextInt()){ case 1: System.out.println("-----------------当前收支明细记录-----------------"); System.out.println("收支\t\t账户金额\t\t收支金额\t\t说 明"); int pos = 0; int principal = 10000; while(pos != i){ principal += check[pos]; if(check[pos] < 0) System.out.println("支出" + "\t\t" + principal + "\t\t" + check[pos] + "\t\t" + reason[pos]); if(check[pos] > 0) System.out.println("收入" + "\t\t" + principal + "\t\t" + check[pos] + "\t\t" + reason[pos]); pos++; } break; case 2: System.out.print("本次收入金额:"); check[i] = scanner.nextInt(); System.out.print("本次收入说明:"); reason[i] = scanner.next(); i += 1; break; case 3: System.out.print("本次支出金额:"); check[i] = -scanner.nextInt(); System.out.print("本次支出说明:"); reason[i] = scanner.next(); i += 1; break; case 4: System.out.println("已退出"); flag = false; break; default: System.out.println("输入不在范围内,请重新输入。"); } }catch (InputMismatchException e){ System.out.println("输入格式错误,请重新输入。"); //当输入异常时,捕捉到异常Exception,开始下一次的循环, // 但是此时数据缓冲区依旧留有我上次输入的异常数据, // 并没有清除这些数据,这时就又开始捕捉异常Exception,还是错误, // 于是这个异常一直被捕捉一直被输出。出现了无限循环的bug。 //解决的方法就是将捕捉到的异常Exception数据去清除。 //方式一 scanner.next(); //方式二 //将scanner定义在try里面 } } scanner.close(); } }
改进:
将输出作为string进行连接,取消数组的有限个数保存。
代码二:

/** * @author FREZXX * @create 2021-05-20 19:40 */ public class FamilyAccount_shk { public static void main(String[] args) { String details = "收支\t账户金额\t收支金额\t说 明\n"; int balance = 10000; boolean loopFlag = true; do { System.out.println("\n-----------------家庭收支记账软件-----------------\n"); System.out.println(" 1 收支明细"); System.out.println(" 2 登记收入"); System.out.println(" 3 登记支出"); System.out.println(" 4 退 出\n"); System.out.print(" 请选择(1-4):"); char key = Utility.readMenuSelection(); System.out.println(); switch (key) { case '1': System.out.println("-----------------当前收支明细记录-----------------"); System.out.println(details); System.out.println("--------------------------------------------------"); break; case '2': System.out.print("本次收入金额:"); int amount1 = Utility.readNumber(); System.out.print("本次收入说明:"); String desc1 = Utility.readString(); balance += amount1; details += "收入\t" + balance + "\t\t" + amount1 + "\t\t" + desc1 + "\n"; System.out.println("---------------------登记完成---------------------"); break; case '3': System.out.print("本次支出金额:"); int amount2 = Utility.readNumber(); System.out.print("本次支出说明:"); String desc2 = Utility.readString(); balance -= amount2; details += "支出\t" + balance + "\t\t" + amount2 + "\t\t" + desc2 + "\n"; System.out.println("---------------------登记完成---------------------"); break; case '4': System.out.print("确认是否退出(Y/N):"); char yn = Utility.readConfirmSelection(); if (yn == 'Y') loopFlag = false; break; } } while (loopFlag); } }