如何为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
相关产品推荐
相关产品推荐

