Java初学者项目实战:开发一个基础的库存管理系统

初学者应先用控制台+内存数据结构(如HashMap)实现库存管理系统核心逻辑,避免过早引入Web、数据库或GUI;用Scanner交互、Product封装、边界校验确保业务正确;打包时注意MANIFEST.MF配置和路径命名。

Java初学者做库存管理系统,不建议从 Web 界面或数据库起步——先用控制台 + 内存数据结构跑通核心逻辑,否则 90% 的人卡在环境配置、Maven 依赖、JDBC 连接失败或 Spring Boot 启动报错上。

HashMap 模拟商品库存,避免过早引入数据库

初学阶段硬上 MySQL 或 H2,会把精力耗在 ClassNotFoundException: com.mysql.cj.jdbc.DriverAccess denied for userFailed to configure a DataSource 这类问题上。先用内存结构验证业务流:

  • HashMap 存商品 ID → 库存数量(简单直观)
  • 加一层 Product 类封装名称、单价等字段,再用 HashMap 管理
  • 所有增删改查操作不涉及 SQL,无连接池、无事务、无异常堆栈干扰
Map inventory = new HashMap<>();
inventory.put("P001", new Product("笔记本", 5.5, 120));
inventory.put("P002", new Product("中性笔", 2.0, 350));

Scanner 实现基础交互,别碰 JavaFX 或 Swing

图形界面在初学阶段是黑洞:JavaFX 需要模块路径配置,Swing 的 EventQueue.invokeLater 和线程模型容易写出假死界面。命令行输入足够训练逻辑拆解能力:

  • Scanner.nextLine() 读取用户输入的指令(如 "add P003 20"
  • String.split(" ") 解析参数,注意空格分割后校验数组长度,防止 ArrayIndexOutOfBoundsException
  • 输入数字时用 Integer.parseInt() 并包 try-catch,提示“请输入有效数字”而非抛出红字异常

库存变更必须校验边界,否则测试用例直接崩

初学者常忽略业务约束,导致“卖出 -5 件”或“库存减到 -200”这种逻辑错误。关键检查点:

  • 入库(add):数量必须 > 0
  • 出库(sell):先查是否存在该商品,再判断当前库存是否 ≥ 要卖出的数量
  • 查询(query):ID 不存在时返回 “商品未找到”,不要返回 null 导致后续 NullPointerException
if (!inventory.con

tainsKey(productId)) { System.out.println("商品未找到:" + productId); return; } Product p = inventory.get(productId); if (p.getStock() < quantity) { System.out.println("库存不足,当前仅剩:" + p.getStock()); return; }

导出为可运行 JAR 前,确认 MANIFEST.MFMain-Class 正确

很多初学者打包后双击没反应,或终端执行 java -jar inventory.jarNo main manifest attribute。核心就两点:

  • Maven 用户:在 pom.xmlmaven-jar-plugin 配置里明确指定 com.example.InventoryApp
  • 手动打包用户:确保 META-INF/MANIFEST.MF 文件含完整行 Main-Class: com.example.InventoryApp(冒号后有空格,结尾有换行)
  • 类路径含中文或空格?直接失败。项目路径用英文纯字母命名

真正卡住初学者的从来不是“怎么写库存逻辑”,而是环境链路上某一个环节的隐式假设被打破——比如以为 System.out.println 会自动刷新缓冲区(实际需要 System.out.flush() 在某些重定向场景下),或者把 product.getId() 当字符串用了却忘了重写 equals/hashCode。先让控制台跑起来,再一环一环加真实依赖。