整数验证和显示用户输入了无效数据时出现问题



这是我正在做的一个Java程序,作为家庭作业的一部分。 我不想为我完成工作,但我被困住了。 我对Java相当陌生,并且使用NetBeans IDE 7.0.1。

尝试验证用户输入时,我在处理某些异常时遇到困难。 该程序将从用户输入中记录慈善捐款。 但是,我尚未成功验证捐赠金额文本字段输入。 如果用户输入文本而不是数字,我希望他们收到输入无效的通知,并且我希望异常处理来处理错误并在用户修复其条目后继续。 任何帮助将不胜感激。

这是我的代码:

package donorgui;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.io.*;
import java.awt.*;
public class DonorGUI extends JFrame
{
// Components
private JPanel panel;
private JTextArea results;
private JButton entryButton;
private JButton exitButton;
private JButton clearButton;
private JTextField donorField;
private JTextField charityField;
private JTextField pledgeField;
//create variables
String[] donorName = new String[20];
String[] charityName = new String[20];
double[] donationAmt = new double[20];
int i = 0;

// Constants for the window size
private final int WINDOW_WIDTH = 750;
private final int WINDOW_HEIGHT = 510;
//Constructor
public DonorGUI(){
    // Set the title.
    setTitle("Donor");
    // Specify what happens when the close button is clicked.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Build the panel that contains the other components.
    buildPanel();
    // Add the panel to the content pane.
    add(panel);
    // Size and display the window.
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    setVisible(true);
}
//The buildPanel method creates a panel containing other components.
private void buildPanel(){
    // Create labels to display instructions.
    JLabel message1 = new JLabel("Name of the Donor:");
    JLabel message2 = new JLabel("Name of the Charity:");
    JLabel message3 = new JLabel("Amount of the Pledge:");
    //instantiate the results area
    results = new JTextArea(25,60);
    // Create text fields to receive user input
    donorField = new JTextField(10);
    charityField = new JTextField(10);
    pledgeField = new JTextField(10);

    //create the user buttons to cause action
    entryButton = new JButton("Enter Donation.");
    entryButton.addActionListener(new EntryButtonListener());
    exitButton = new JButton("EXIT");
    exitButton.addActionListener(new ExitButtonListener());
    clearButton = new JButton ("Clear Fields");
    clearButton.addActionListener(new ClearButtonListener());

    // Create a panel.
    panel = new JPanel();
    //set the LayoutManager
    panel.setLayout(new FlowLayout());
    // Add the labels, text fields, and button to the panel.
    panel.add(message1);
    panel.add(donorField);
    panel.add(message2);
    panel.add(charityField);
    panel.add(message3);
    panel.add(pledgeField);
    panel.add(results);
    panel.add(entryButton);
    panel.add(exitButton);
    panel.add(clearButton);
}
private class EntryButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        donorName[i] = donorField.getText();
        charityName[i] = charityField.getText();
        donationAmt[i] = Double.parseDouble(pledgeField.getText());
        results.append(donorName[i]+" "+charityName[i]+" "+donationAmt[i]+"n ");
        i++;
    } 
}
public boolean donationAmt(String amount) {
    int i = 0;
    try {
        i = Integer.parseInt (amount);
        return true;
    }
    catch (NumberFormatException e) {
        JOptionPane.showMessageDialog(null, "Invalid Input.  Please enter a dollar amount");
        return false;
    }

}
private class ClearButtonListener implements ActionListener {
    @Override
    public void actionPerformed (ActionEvent e) {
        donorField.setText("");
        charityField.setText("");
        pledgeField.setText("");
        }
}
private class ExitButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}
/* Application method */
public static void main(String[] args){
    DonorGUI rpc = new DonorGUI();
}

}

这是我修改后的代码。 经过一些用户输入测试后,当我使用 100.00、40.00 等时,我收到异常......而不是整数美元金额,例如 100、40 等。有什么想法吗?

package donorgui;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.io.*;
import java.awt.*;
public class DonorGUI extends JFrame
{
// Components
private JPanel panel;
private JTextArea results;
private JButton entryButton;
private JButton exitButton;
private JButton clearButton;
private JTextField donorField;
private JTextField charityField;
private JTextField pledgeField;
//create variables
String[] donorName = new String[20];
String[] charityName = new String[20];
double[] donationAmt = new double[20];
int i = 0;

// Constants for the window size
private final int WINDOW_WIDTH = 750;
private final int WINDOW_HEIGHT = 550;
//Constructor
public DonorGUI(){
    // Set the title.
    setTitle("Donor");
    // Specify what happens when the close button is clicked.
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // Build the panel that contains the other components.
    buildPanel();
    // Add the panel to the content pane.
    add(panel);
    // Size and display the window.
    setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    setVisible(true);
}
//The buildPanel method creates a panel containing other components.
private void buildPanel(){
    // Create labels to display instructions.
    JLabel message1 = new JLabel("Name of the Donor:");
    JLabel message2 = new JLabel("Name of the Charity:");
    JLabel message3 = new JLabel("Amount of the Pledge:");
    //instantiate the results area
    results = new JTextArea(25,60);

    // Create text fields to receive user input
    donorField = new JTextField(10);
    charityField = new JTextField(10);
    pledgeField = new JTextField(10);

    //create the user buttons to cause action
    entryButton = new JButton("Enter Donation.");
    entryButton.addActionListener(new EntryButtonListener());
    exitButton = new JButton("EXIT");
    exitButton.addActionListener(new ExitButtonListener());
    clearButton = new JButton ("Clear Fields");
    clearButton.addActionListener(new ClearButtonListener());

    // Create a panel.
    panel = new JPanel();
    //set the LayoutManager
    panel.setLayout(new FlowLayout());
    // Add the labels, text fields, and button to the panel.
    panel.add(message1);
    panel.add(donorField);
    panel.add(message2);
    panel.add(charityField);
    panel.add(message3);
    panel.add(pledgeField);
    panel.add(results);
    panel.add(entryButton);
    panel.add(exitButton);
    panel.add(clearButton);
}
private class EntryButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        donorName[i] = donorField.getText();
        charityName[i] = charityField.getText();
                if (donationAmt(pledgeField.getText())) {
                    donationAmt[i] = Double.parseDouble(pledgeField.getText());
                }
        results.append(donorName[i]+" "+charityName[i]+" "+donationAmt[i]+"n ");
        i++;
    } 
}
public boolean donationAmt(String amount) {
   if(amount==null || amount=="" || amount.length()<1){  //checking for empty field
        JOptionPane.showMessageDialog(null, "Please enter a dollar amount");
        return false;
    }
    for(int i = 0; i < amount.length(); i++){  //verifying dollar amount entered as number
            if (!Character.isDigit(amount.charAt(i))){ 
                JOptionPane.showMessageDialog(null, "Invalid input.  Please enter a dollar amount");
                return false;
            } 
    }
    return true;
}

private class ClearButtonListener implements ActionListener {
    @Override
    public void actionPerformed (ActionEvent e) {
        donorField.setText("");
        charityField.setText("");
        pledgeField.setText("");
        }
}
private class ExitButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}
/* Application method */
public static void main(String[] args){
    DonorGUI rpc = new DonorGUI();
}

}

您可以使用

InputVerifier ,在这里讨论。

private class EntryButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        donorName[i] = donorField.getText();
        charityName[i] = charityField.getText();
        if(donationAmt(pledgeField.getText())){
            donationAmt[i] = Double.parseDouble(pledgeField.getText());
            results.append(donorName[i] + " " + charityName[i] + " " + donationAmt[i] + "n ");
            i++;
        } 
    }
}

这样的事情会起作用。这将检查金额不为空,并且仅包含基于现有方法的数字。

public boolean donationAmt(String amount) {
       if(amount==null || amount=="" || amount.length()<1){  //check so that the amount field is not empty, pherhaps you can add a check so the amound is not 0 :)
            JOptionPane.showMessageDialog(null, "Invalid Input. The amount cannot be empty");
            return false;
        }
        for(int i = 0; i < amount.length(); i++){  //loop thru the string and check so that each char is a digit
                if (!Character.isDigit(amount.charAt(i))){ 
                    JOptionPane.showMessageDialog(null, "The amount can contain only numbers");
                    return false;
                } 
return true;

如果要确保数量不是 0,一种方法是将 amount 解析为 int,然后检查以便parsedAmount<0 .这应该在验证金额不为空并且只是数字(例如 last:))后完成,以避免 NPE 和数字格式异常

最新更新