java方法、数组、控制语句综合小案例-创新互联

1. 要求:模拟实现一个基于文本界面的《家庭记账软件》

主菜单:

公司主营业务:网站建设、成都网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出七星免费做网站回馈大家。

活动流程图 

详细要求

子功能要求

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;
        }
    }


过程中遇到的问题

  1. 在编写获取用户正确输入的逻辑代码时,采用循环读取来正确获取,其中在循环中使用try/catch语句捕捉InputMismatchException,当用户出现错误输入时,程序进入死循环,不再阻塞等待用户输入。
  2. 错误代码:
    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;
                }
        }

    原本想法:如果输入的不是数字,捕获异常并跳过本次循环,接收下一次输入

  3. 运行结果

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