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

如何为Java Swing点餐程序添加负数/超限输入的错误校验

解决方案

首先,先定义订购数量的最大值常量(示例设为100,可根据需求自定义),在常量声明区添加:

private static final int MAX_QUANTITY = 100; // 自定义最大订购量

接下来在解析输入数字后,添加合法性校验逻辑:检查每个商品数量是否为负数或超出最大值,只要有一项不合法就弹出对应错误提示并终止后续计算。同时补充非数字输入的异常处理,避免程序崩溃。

修改后的核心逻辑(actionPerformed方法)

@Override
public void actionPerformed(ActionEvent e) {
    // 检查空输入
    if(nSodasField.getText().trim().isEmpty() || nSandwichesField.getText().trim().isEmpty() || nBananasField.getText().trim().isEmpty()) {
        JOptionPane.showMessageDialog(null, "请填写所有商品的订购数量!");
        return;
    }

    int nSodas, nSandwiches, nBananas;
    try {
        // 解析输入为整数
        nSodas = Integer.parseInt(nSodasField.getText().trim());
        nSandwiches = Integer.parseInt(nSandwichesField.getText().trim());
        nBananas = Integer.parseInt(nBananasField.getText().trim());
    } catch (NumberFormatException ex) {
        JOptionPane.showMessageDialog(null, "请输入有效的数字!");
        return;
    }

    // 校验订购数量合法性:负数或超出最大值
    if (nSodas < 0 || nSodas > MAX_QUANTITY) {
        JOptionPane.showMessageDialog(null, "苏打水的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
        return;
    }
    if (nSandwiches < 0 || nSandwiches > MAX_QUANTITY) {
        JOptionPane.showMessageDialog(null, "三明治的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
        return;
    }
    if (nBananas < 0 || nBananas > MAX_QUANTITY) {
        JOptionPane.showMessageDialog(null, "香蕉的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
        return;
    }

    // 计算订单金额并生成结果文本
    double orderSubTotal = (nSodas * COST_PER_SODA) + (nSandwiches * COST_PER_SANDWICH) + (nBananas * COST_PER_BANANA);    
    double tax = orderSubTotal * TAX_PERCENT; 
    double orderTotal = orderSubTotal + tax;  

    String orderString = "欢迎光临本店:\n" +
        "-------------------------------------\n" +
        "苏打水: " + nSodas + "\n三明治: " + nSandwiches + "\n香蕉: " + nBananas + "\n" +
        "====================\n" +
        "订单小计: $" + String.format("%.2f", orderSubTotal) + "\n" +
        "7%税费: $" + String.format("%.2f", tax) + "\n" +
        "订单总计: $" + String.format("%.2f", orderTotal) + "\n感谢惠顾!";
        
    orderTotalArea.setText(orderString);    
}

完整修改后的代码

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class AndreLunchShop {

    // 声明常量及价格
    private static final double COST_PER_SODA = 1;   
    private static final double COST_PER_SANDWICH = 3;   
    private static final double COST_PER_BANANA = 0.5;   
    private static final double TAX_PERCENT = 0.07;   
    private static final int MAX_QUANTITY = 100; // 最大订购量,可自定义

    public static void main(String[] args) {
        JFrame mainFrame = new JFrame("Andre的午餐店");      
        JPanel mainPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));    

        // 苏打水相关组件
        JPanel sodaSubPanel = new JPanel(new GridLayout(1, 3));   
        JLabel sodaNameLabel = new JLabel("苏打水");  
        JLabel sodaCostLabel = new JLabel("$1 每份");  
        JTextField nSodasField = new JTextField(10);
 
        sodaSubPanel.add(sodaNameLabel);    
        sodaSubPanel.add(sodaCostLabel);    
        sodaSubPanel.add(nSodasField);    

        // 三明治相关组件
        JPanel sandwichSubPanel = new JPanel(new GridLayout(1, 3));   
        JLabel sandwichNameLabel = new JLabel("三明治");  
        JLabel sandwichCostLabel = new JLabel("$3 每份");  
        JTextField nSandwichesField = new JTextField(10);
   
        sandwichSubPanel.add(sandwichNameLabel);    
        sandwichSubPanel.add(sandwichCostLabel);    
        sandwichSubPanel.add(nSandwichesField);    

        // 香蕉相关组件
        JPanel bananaSubPanel = new JPanel(new GridLayout(1, 3));   
        JLabel bananaNameLabel = new JLabel("香蕉");  
        JLabel bananaCostLabel = new JLabel("$0.50 每份");  
        JTextField nBananasField = new JTextField(10);  

        bananaSubPanel.add(bananaNameLabel);    
        bananaSubPanel.add(bananaCostLabel);    
        bananaSubPanel.add(nBananasField);    

        // 计算按钮面板
        JPanel buttonSubPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));   
        JButton calculateButton = new JButton("计算订单"); 

        buttonSubPanel.add(calculateButton);    

        // 订单总计显示面板
        JPanel orderTotalSubPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));   
        JTextArea orderTotalArea = new JTextArea(10, 30);    
        orderTotalArea.setEditable(false);  
        Border border = BorderFactory.createTitledBorder("您的订单总计");    
        orderTotalArea.setBorder(border);   

        orderTotalSubPanel.add(orderTotalArea);    

        // 添加所有子面板到主面板
        mainPanel.add(sodaSubPanel);  
        mainPanel.add(sandwichSubPanel);  
        mainPanel.add(bananaSubPanel);  
        mainPanel.add(buttonSubPanel);  
        mainPanel.add(orderTotalSubPanel);  

        // 主窗口设置
        mainFrame.add(mainPanel);   
        mainFrame.setSize(380, 370);                    
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
        mainFrame.setLocationRelativeTo(null);                       
        mainFrame.setVisible(true);                                

        calculateButton.addActionListener(new ActionListener() {
       
            @Override
            public void actionPerformed(ActionEvent e) {
                // 检查空输入
                if(nSodasField.getText().trim().isEmpty() || nSandwichesField.getText().trim().isEmpty() || nBananasField.getText().trim().isEmpty()) {
                    JOptionPane.showMessageDialog(null, "请填写所有商品的订购数量!");
                    return;
                }

                int nSodas, nSandwiches, nBananas;
                try {
                    // 解析输入为整数
                    nSodas = Integer.parseInt(nSodasField.getText().trim());
                    nSandwiches = Integer.parseInt(nSandwichesField.getText().trim());
                    nBananas = Integer.parseInt(nBananasField.getText().trim());
                } catch (NumberFormatException ex) {
                    JOptionPane.showMessageDialog(null, "请输入有效的数字!");
                    return;
                }

                // 校验订购数量合法性
                if (nSodas < 0 || nSodas > MAX_QUANTITY) {
                    JOptionPane.showMessageDialog(null, "苏打水的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
                    return;
                }
                if (nSandwiches < 0 || nSandwiches > MAX_QUANTITY) {
                    JOptionPane.showMessageDialog(null, "三明治的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
                    return;
                }
                if (nBananas < 0 || nBananas > MAX_QUANTITY) {
                    JOptionPane.showMessageDialog(null, "香蕉的订购数量不能为负数或超过" + MAX_QUANTITY + "!");
                    return;
                }

                // 计算订单金额
                double orderSubTotal = (nSodas * COST_PER_SODA) + (nSandwiches * COST_PER_SANDWICH) + (nBananas * COST_PER_BANANA);    
                double tax = orderSubTotal * TAX_PERCENT; 
                double orderTotal = orderSubTotal + tax;  

                String orderString = "欢迎光临本店:\n" +
                    "-------------------------------------\n" +
                    "苏打水: " + nSodas + "\n三明治: " + nSandwiches + "\n香蕉: " + nBananas + "\n" +
                    "====================\n" +
                    "订单小计: $" + String.format("%.2f", orderSubTotal) + "\n" +
                    "7%税费: $" + String.format("%.2f", tax) + "\n" +
                    "订单总计: $" + String.format("%.2f", orderTotal) + "\n感谢惠顾!";
                    
                orderTotalArea.setText(orderString);    
            }
        });
    }
}

说明

  • MAX_QUANTITY常量可根据实际需求修改数值,定义每种商品的最大订购上限
  • 新增非数字输入的异常捕获,避免程序因非法输入崩溃
  • 独立校验每种商品的数量,给出精准的错误提示
  • 所有校验不通过时立即终止后续流程,确保只有合法输入才会进入金额计算环节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:04:54