java方法、数组、控制语句综合小案例-创新互联
1. 要求:模拟实现一个基于文本界面的《家庭记账软件》
标题名称:java方法、数组、控制语句综合小案例-创新互联
网页路径:http://azwzsj.com/article/diicee.html
主菜单:
公司主营业务:网站建设、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出七星免费做网站回馈大家。活动流程图
详细要求
子功能要求
import java.util.InputMismatchException;
import java.util.Scanner;
@SuppressWarnings("all")
public class Family_2 {
public static Scanner sc = new Scanner(System.in);
public static boolean loop = true;
public static int principal = 1000;
public static int count = 0;
public static String[] arr = new String[10];
public static void main(String[] args) {
run();
System.out.println(arr.length);
}
// 运行方法
public static void run() {
while (loop) {
show();
System.out.println("请输入你的选择(1~4)");
int select = sc.nextInt();
selection(select);
}
}
// 主界面展示
public static void show() {
System.out.println("-------家庭收支管理系统-------");
System.out.println(" 1.收支明细");
System.out.println(" 2.登记收入");
System.out.println(" 3.登记支出");
System.out.println(" 4.退 出");
}
// 功能选择
public static void selection(int select) {
if (select != 4 && count == arr.length - 1)
expansion();
switch (select) {
case 1:
prrintDetails();
break;
case 2:
registerIncome();
break;
case 3:
registerOutcome();
break;
case 4:
loop = false;
System.out.println("4.退出");
break;
}
}
// 打印明细
public static void prrintDetails() {
System.out.println("收支\t账户总金额\t收支金额\t\t说明");
if (count == 0) {
System.out.println("这里空空如也");
return;
}
System.out.println("....");
for (int i = 0; i< count; i++) {
String str = arr[i];
if (str.length() >30)
str = substr(str);
System.out.println(str);
}
}
// 登记收入
public static void registerIncome() {
System.out.print("输入你的存款金额,");
int add = scanf();
principal += add;
System.out.println("输入你本次存款的来源");
String str = sc.next();
arr[count++] = "收入\t" + principal + "\t " + add + paddedStr(add) + str;
}
// 登记支出
public static void registerOutcome() {
System.out.println("输入你的取款金额");
int subtract = scanf();
if (principal< subtract) {
System.out.println("余额不足");
return;
}
principal -= subtract;
System.out.println("输入你本次取款的原因");
String str = sc.next();
System.out.println("本次说明的长度");
arr[count++] = "支出\t" + principal + "\t " + subtract + "" +paddedStr(subtract) + str;
}
// 数组扩容
public static void expansion() {
int oldLen = arr.length;
int newLen = oldLen + (oldLen<< 1);
String[] str = new String[newLen];
System.arraycopy(arr, 0, str, 0, count + 1);
arr = str;
}
// 字符串补齐
public static String paddedStr(int money) {
return money >= 100 ? " \t\t" : " \t\t";
}
public static String substr(String str){
// 输出时,较长的字符串转换为 xxx...
str = str.substring(0, 30);
System.out.println("省略后的字符串");
return str+ "...";
}
// 安全输入
public static int scanf() {
int num = 0;
System.out.println("请输入0~100000的数字");
try {
num = sc.nextInt();}
catch (InputMismatchException e){
sc.next();
num = scanf();
return num;
}
// 因无其他要求,此处仅判断金额大于 0
if (num >0)
return num;
return -1;
}
}
过程中遇到的问题
- 在编写获取用户正确输入的逻辑代码时,采用循环读取来正确获取,其中在循环中使用try/catch语句捕捉InputMismatchException,当用户出现错误输入时,程序进入死循环,不再阻塞等待用户输入。
- 错误代码:
1 public static int scanf() { 2 int num = 0; 3 while (true) { 4 System.out.println("请输入0~100000的数字"); 5 try { 6 num = sc.nextInt();} 7 catch (InputMismatchException e){ 8 continue; 9 } 10 if (num >0) 11 return num; } }
原本想法:如果输入的不是数字,捕获异常并跳过本次循环,接收下一次输入
运行结果
4.原因
在使用Scanner中nextInt扫描时,如果输入的不是一个整数,系统会认为是当前格式无法解析该数据,从而导致该数据一直留在缓冲区,导致之后的输入异常。
5.解决方案
1.将缓冲区的数据读取
public static int scanf() {
int num = 0;
while (true) {
System.out.println("请输入0~100000的数字");
try {
num = sc.nextInt();}
catch (InputMismatchException e){
// 下面的读取将会把sc.nextInt中的错误输入读取
sc.next();
continue;
}
if (num >0)
return num;
}
}
2.关闭上一个Scanner,重新创建,会刷新缓冲区
public static int scanf() {
int num = 0;
while (true) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入0~100000的数字");
try {
num = sc.nextInt();}
catch (InputMismatchException e){
continue;
}
if (num >0)
return num;
}
}
3.不建议在循环中使用try catch,上述代码可改为:
public static int scanf() {
int num = 0;
System.out.println("请输入0~100000的数字");
try {
num = sc.nextInt();}
catch (InputMismatchException e){
return num = scanf();
}
if (num >0)
return num;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
标题名称:java方法、数组、控制语句综合小案例-创新互联
网页路径:http://azwzsj.com/article/diicee.html