You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java新手求助:POS系统中从Item列表取值及重量校验异常处理

嘿,作为Java新手能搭建到这一步已经超棒啦!我来帮你搞定这两个问题👇

一、实现isWeightReqd相关的异常处理逻辑

首先,咱们得先明确你的Item类里应该有对应数据库的weightRequired属性(用来标记是否需要重量),还有存储重量的字段。然后isWeightReqd其实就是判断这个属性的状态,核心是在用户录入时,当该属性为true但未提供有效重量时抛出异常。

第一步:完善Item类的核心属性

先确保你的Item类包含这些关键属性和getter/setter:

public class Item {
    private String itemId;
    private String itemName;
    private boolean weightRequired; // 对应数据库的weight required=true/false
    private double weight; // 存储商品重量,仅当weightRequired为true时需要
    
    // 已有的其他属性和getter/setter...
    
    public boolean isWeightRequired() { // 就是你说的isWeightReqd方法,Java规范里布尔类型用is开头
        return weightRequired;
    }

    public void setWeightRequired(boolean weightRequired) {
        this.weightRequired = weightRequired;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }
}

第二步:自定义异常+校验方法

咱们可以写一个专门的异常类来处理重量缺失的情况,再写一个校验方法来触发异常:

// 自定义异常,专门用于提示重量未录入的错误
public class MissingWeightException extends Exception {
    public MissingWeightException(String message) {
        super(message);
    }
}

// 校验商品重量的方法,放在你的业务处理类里(比如POSService)
public void checkWeightRequirement(Item item) throws MissingWeightException {
    // 调用isWeightRequired判断是否需要重量
    if (item.isWeightRequired()) {
        // 这里判断重量是否有效(比如<=0视为未录入)
        if (item.getWeight() <= 0) {
            throw new MissingWeightException("商品【" + item.getItemName() + "】需要录入重量,请重新填写!");
        }
    }
}

第三步:在录入流程中调用校验

当用户录入完商品、设置好Item的属性后,用try-catch包裹校验逻辑,捕获异常并提示用户:

// 假设你已经通过setters把用户录入的信息封装成了newItem对象
List<Item> itemList = new ArrayList<>(); // 你的Item集合

try {
    checkWeightRequirement(newItem);
    // 校验通过,加入集合
    itemList.add(newItem);
    System.out.println("商品录入成功!");
} catch (MissingWeightException e) {
    // 异常处理:给用户提示错误,比如控制台输出或者界面弹窗
    System.err.println(e.getMessage());
    // 这里可以添加逻辑让用户重新录入该商品的重量
}
二、从List中提取特定/孤立值

这里分几种常见场景,用Java 8+的Stream API会更简洁,当然也给你传统循环的写法作为参考:

场景1:提取单个符合条件的商品(比如根据itemId找商品)

// 方法1:传统for循环
Item targetItem = null;
for (Item item : itemList) {
    if ("SP001".equals(item.getItemId())) { // 替换成你要找的itemId
        targetItem = item;
        break; // 找到就退出循环,提高效率
    }
}
if (targetItem != null) {
    // 提取你需要的值,比如商品名称、价格
    String name = targetItem.getItemName();
    System.out.println("找到目标商品:" + name);
} else {
    System.out.println("未找到对应商品");
}

// 方法2:Stream API(更简洁,推荐)
Optional<Item> optionalItem = itemList.stream()
    .filter(item -> "SP001".equals(item.getItemId()))
    .findFirst();
// 用Optional避免空指针
optionalItem.ifPresent(item -> {
    String name = item.getItemName();
    System.out.println("找到目标商品:" + name);
});

场景2:提取所有符合条件的商品(比如所有需要重量的商品)

// 用Stream提取所有weightRequired=true的商品
List<Item> weightNeededItems = itemList.stream()
    .filter(Item::isWeightRequired) // 方法引用,等价于item -> item.isWeightRequired()
    .collect(Collectors.toList());

// 遍历提取到的列表,获取每个商品的信息
weightNeededItems.forEach(item -> {
    System.out.println("需要重量的商品:ID=" + item.getItemId() + ",名称=" + item.getItemName());
});

场景3:提取单个属性的集合(比如所有商品的名称)

如果你只需要某个属性的值,比如所有商品的名称,可以直接提取成单独的集合:

List<String> allItemNames = itemList.stream()
    .map(Item::getItemName) // 提取商品名称属性
    .collect(Collectors.toList());

// 输出所有名称
allItemNames.forEach(System.out::println);

内容的提问来源于stack exchange,提问作者breadfan18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:10:13