导读:本期聚焦于小伙伴创作的《如何用Java开发超市商品录入程序并实现输入输出与数据校验?》,敬请观看详情。超市收银系统中的商品录入模块若缺乏严谨校验,极易把错误价格和库存写进数据库。本文从控制台输入流读取讲起,说明如何用Scanner接收商品名称、条码与售价,并在接收后判断数值范围与格式合法性。对比直接赋值与先校验再封装两种方式,后者能减少后续空指针与负数订单。文中给出基于正则与异常捕获的校验示例,并分析边界场景,例如条码重复与小数精度丢失,帮助初学者写出健壮的录入逻辑。

在超市管理系统的开发中,商品录入是最基础也是最容易出错的功能。一个稳定的录入程序不仅要完成控制台的输入与输出,还要在数据进入业务层之前拦截不合法内容。下面我们从工程实现角度拆解其中的关键步骤。

如何用Java开发超市商品录入程序并实现输入输出与数据校验?

一、使用Scanner完成基本输入输出

Java标准库中的java.util.Scanner可以方便地从System.in读取用户输入。在商品录入场景中,通常需要采集商品名称、条码和售价三类信息。我们先看一段最基础的读取代码,再逐步加入校验逻辑。

下面的示例展示了如何通过控制台依次录入字段并打印回显。注意Scanner读取字符串与浮点数时的方法差异,若直接读取可能出现换行符残留问题,因此常用nextLine()做统一消费。

import java.util.Scanner;

public class ProductInput {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入商品名称:");
        String name = sc.nextLine();

        System.out.print("请输入商品条码:");
        String barcode = sc.nextLine();

        System.out.print("请输入商品售价:");
        double price = sc.nextDouble();
        sc.nextLine(); // 消费换行符

        System.out.println("录入成功: " + name + ", " + barcode + ", " + price);
        sc.close();
    }
}

上述代码虽然能跑通,但没有任何防护。如果用户输入售价为负,或者条码包含字母,程序也会照单全收。实际项目中,这种数据会污染后续统计报表。

因此我们在保留Scanner输入结构的同时,必须把校验独立成方法,做到读取与检查分离。这样既方便单元测试,也降低主流程复杂度。

二、商品数据校验的核心维度

数据校验通常包含格式校验与业务规则校验两类。格式校验关注条码是否为纯数字、名称是否非空;业务规则校验则限定售价大于零、库存为整数等。我们用一个工具类来承载这些规则。

正则表达式是处理格式校验的利器。对于条码,国内超市常用13位或8位数字,可以用^d{8}$|^d{13}$做匹配。名称则简单判断trim后长度大于零即可。下面的代码演示了如何封装这些判断。

public class ProductValidator {
    // 校验名称
    public static boolean isValidName(String name) {
        return name != null && name.trim().length() > 0;
    }

    // 校验条码: 8位或13位数字
    public static boolean isValidBarcode(String barcode) {
        if (barcode == null) {
            return false;
        }
        return barcode.matches("^\d{8}$|^\d{13}$");
    }

    // 校验售价
    public static boolean isValidPrice(double price) {
        return price > 0 && price < 1000000;
    }
}

将校验逻辑外置后,主程序在拿到输入后可立即调用对应方法。若返回false,则提示重新输入而不是直接退出,这样用户体验更友好。

除了返回布尔值,也可以抛出异常来中断流程。两种方式各有优劣:布尔值适合循环重试,异常适合在录入批量商品时快速失败。小工具程序推荐用布尔加循环,大型系统可用自定义异常统一处理。

三、整合输入与校验的完整录入流程

把前面两块拼起来,就能得到一个带防护的录入程序。核心思路是:每读一项就校验一项,不通过就重读。这样避免了把所有错误堆到末尾才报出。

下面的完整示例用while循环包裹条码录入,直到用户输入合法为止。售价同理。这种方式比一次性读完再校验更符合交互直觉,也减少了无效对象创建。

import java.util.Scanner;

public class SupermarketEntry {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String name = "";
        String barcode = "";
        double price = 0;

        while (true) {
            System.out.print("商品名称:");
            name = sc.nextLine();
            if (ProductValidator.isValidName(name)) {
                break;
            }
            System.out.println("名称不能为空,请重输");
        }

        while (true) {
            System.out.print("商品条码:");
            barcode = sc.nextLine();
            if (ProductValidator.isValidBarcode(barcode)) {
                break;
            }
            System.out.println("条码须为8或13位数字");
        }

        while (true) {
            System.out.print("商品售价:");
            String line = sc.nextLine();
            try {
                price = Double.parseDouble(line);
            } catch (NumberFormatException e) {
                System.out.println("售价必须是数字");
                continue;
            }
            if (ProductValidator.isValidPrice(price)) {
                break;
            }
            System.out.println("售价需在0到100万之间");
        }

        System.out.println("已录入: " + name + "|" + barcode + "|" + price);
        sc.close();
    }
}

这段代码中售价读取先用字符串再解析,是为了捕获格式异常,比直接nextDouble()更安全。若用户输入字母,程序不会崩,而是提示重输。

在真实超市系统中,录入后往往还要查重。可在校验通过后调用数据库或内存集合判断条码是否已存在,若存在则要求换条码或走修改流程。本文聚焦输入输出与基础校验,查重可作为下一步扩展。

四、常见误区与改进建议

初学者常把nextDouble()nextLine()混用导致跳过输入,本质是对Scanner分隔符理解不清。统一用nextLine()再自行解析能规避多数坑。

另一个误区是只校验非空不校验范围。比如售价写成负数,打印小票就会出现倒贴钱。业务边界必须在录入层拦死,而不是指望后续计算修正。把校验方法集中管理,也方便以后对接Web接口复用同一套规则。

做法优点风险
直接赋值不校验代码短脏数据进库
读取后统一校验结构清晰错误反馈滞后
逐项读取逐项校验交互友好循环稍多

从表中可以看出,逐项校验虽然多写几个循环,但换来更低的维护成本和更高的数据质量,是小型录入工具的首选。

当程序后续要升级为图形界面或Spring Boot接口时,本文的Validator类几乎不用改,只需把Scanner换成HTTP参数即可,这也是分层设计带来的长期收益。

Java商品录入数据校验修改时间:2026-08-06 18:30:47

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。