Java actionPerformed处的NullPointerException。不知道为什么

Java actionPerformed处的NullPointerException。不知道为什么,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,我正在创建一个Java程序,它使用GUI显示抵押贷款付款。我试图输出到一个文本区的付款,将为抵押贷款。这是我的密码: import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.text.DecimalFormat; public class MortgageGui extends JFrame implements ActionListener { // Set two-places for d

我正在创建一个Java程序,它使用GUI显示抵押贷款付款。我试图输出到一个文本区的付款,将为抵押贷款。这是我的密码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.text.DecimalFormat;

public class MortgageGui extends JFrame implements ActionListener {

// Set two-places for decimal format
DecimalFormat twoPlaces = new DecimalFormat("$0.00");

// Declare variable for calculation
Double loanAmt;
double interestRate;
double monthlyPayment;
int payment;
String amount;

JTextField loanAmount;
JComboBox loanTypeBox;
JLabel paymentOutput;
JTextArea paymentList;

// Build arrays for mortgages
double[] mortgage1 = {7.0, 5.35, 0.0}; // (years, interest, monthly payment)
double[] mortgage2 = {15.0, 5.5, 0.0}; // (years, interest, monthly payment)
double[] mortgage3 = {30.0, 5.75, 0.0}; // (years, interest, monthly payment)


public MortgageGui() {

    super("Mortgage Calculator");
    setLookAndFeel();
    setSize(350, 500);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Loan Amount Panel
    JPanel loanAmtPanel = new JPanel();
    JLabel loanAmtLabel = new JLabel("Loan Amount: ", JLabel.LEFT);
    JTextField loanAmount = new JTextField(10);
    loanAmtPanel.add(loanAmtLabel);
    loanAmtPanel.add(loanAmount);

    // Loan Type Panel
    JPanel loanTypePanel = new JPanel();
    JLabel loanTypeLabel = new JLabel("Loan Type: ", JLabel.LEFT);
    String[] items = {"7 years at 5.35%", "15 years at 5.5%", "30 years at 5.75%"};
    JComboBox loanTypeBox = new JComboBox(items);
    loanTypePanel.add(loanTypeLabel);
    loanTypePanel.add(loanTypeBox);

    // Calculate Button Panel
    JPanel calculatePanel = new JPanel();
    JButton calcButton = new JButton("Calculate Paytment");
    calcButton.addActionListener(this);
    calculatePanel.add(calcButton);

    // Monthly Payment Panel
    JPanel paymentPanel = new JPanel();
    JLabel paymentLabel = new JLabel("Monthly Payment: ", JLabel.LEFT);
    JLabel paymentOutput = new JLabel("Calculated Payment");
    paymentPanel.add(paymentLabel);
    paymentPanel.add(paymentOutput);

    // View Payments Panel
    JPanel viewPayments = new JPanel();
    JTextArea paymentList = new JTextArea("", 17, 27);
    paymentList.setEditable(false);
    paymentList.setLineWrap(true);
    viewPayments.add(paymentList);

    // Add panels to win Panel
    JPanel win = new JPanel();
    BoxLayout box = new BoxLayout(win, BoxLayout.Y_AXIS);
    win.setLayout(box);
    win.add(loanAmtPanel);
    win.add(loanTypePanel);
    win.add(calculatePanel);
    win.add(paymentPanel);
    win.add(viewPayments);
    add(win);

    // Make window visible
    setVisible(true);
}


private void setLookAndFeel() {
    try {
        UIManager.setLookAndFeel(
            "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"
        );
    } catch (Exception exc) {
        // ignore
      }
}


public void actionPerformed(ActionEvent e) {

    // Clear payment list
    paymentList.setText("");

    // Get loan amount from textfield
    String amount = loanAmount.getText();
    loanAmt = Double.valueOf(amount).doubleValue();

    // Find which mortgate array to use from combobox
    Object obj = loanTypeBox.getSelectedItem();
    String loanSelected = obj.toString();

    // Run the calculation based on the mortgage arrays

    // 7-year loan
    if (loanSelected.equals("7 years at 5.35%")) {
        // Calculate payment, interest, and remaining
        mortgage1[2] = (loanAmt + (loanAmt * (mortgage1[1] / 100))) / (mortgage1[0] * 12);
        double interest1 = (loanAmt * (mortgage1[1] / 100)) / 84;
        double amountRemaining1 = loanAmt + (loanAmt * (mortgage1[1] / 100));

        // Loop through payments
        for (int payment = 1; payment <=84; payment++) {

            // Deduct one payment from the balance
            amountRemaining1 = amountRemaining1 - mortgage1[2];

            // Write payment to textArea
            paymentList.append("Payment " + payment + ": $" + twoPlaces.format(mortgage1[2]) +
                               " / " + "Interest: $" + twoPlaces.format(interest1) + " / " +
                               "Remaining: $" + twoPlaces.format(amountRemaining1) + "\n");
        }

    } else {
        // 15-year loan
        if (loanSelected.equals("15 years at 5.5%")) {

            // Calculate payment, interest, and remaining
            mortgage2[2] = (loanAmt + (loanAmt * (mortgage2[1] / 100))) / (mortgage2[0] * 12);
            double interest2 = (loanAmt * (mortgage2[1] / 100)) / 180;
            double amountRemaining2 = loanAmt + (loanAmt * (mortgage2[1] / 100));

            // Loop through payments
            for (int payment = 1; payment <=180; payment++) {

                // Deduct one payment from the balance
                amountRemaining2 = amountRemaining2 - mortgage2[2];

                // Write payment to textArea
                paymentList.append("Payment " + payment + ": $" + twoPlaces.format(mortgage2[2]) +
                                   " / " + "Interest: $" + twoPlaces.format(interest2) + " / " +
                                   "Remaining: $" + twoPlaces.format(amountRemaining2) + "\n");
            }

        } else {
            //30-year loan

            //Calculate payment, interest, and remaining
            mortgage3[2] = (loanAmt + (loanAmt * (mortgage3[1] / 100))) / (mortgage3[0] * 12);
            double interest3 = (loanAmt * (mortgage3[1] / 100)) / 360;
            double amountRemaining3 = loanAmt + (loanAmt * (mortgage3[1] / 100));

            // Loop through payments
            for (int payment = 1; payment <=360; payment++) {

                // Deduct one payment from the balance
                amountRemaining3 = amountRemaining3 - mortgage3[2];

                // Write payment to textArea
                paymentList.append("Payment " + payment + ": $" + twoPlaces.format(mortgage3[2]) +
                                   " / " + "Interest: $" + twoPlaces.format(interest3) + " / " +
                                   "Remaining: $" + twoPlaces.format(amountRemaining3) + "\n");
            }
        }
    }
}


public static void main(String[] arguments) {
    MortgageGui calc = new MortgageGui();
}
}
import javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
导入java.text.DecimalFormat;
公共类MortgageGui扩展JFrame实现ActionListener{
//为十进制格式设置两位
DecimalFormat twoPlaces=新的DecimalFormat($0.00”);
//声明用于计算的变量
双重贷款;
双酯;
双月付款;
国际贸易支付;
字符串数量;
JTextField loanAmount;
JComboBox loantypox;
JLabel paymentOutput;
JTextArea支付清单;
//为抵押贷款构建阵列
双[]抵押1={7.0,5.35,0.0};/(年、利息、月付款)
双[]抵押2={15.0,5.5,0.0};//(年、利息、月付款)
双[]抵押3={30.0,5.75,0.0};/(年、利息、每月付款)
公共抵押贷款{
超级(“抵押计算器”);
setLookAndFeel();
设置大小(350500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//贷款金额小组
JPanel loanAmtPanel=新的JPanel();
JLabel loanAmtLabel=新JLabel(“贷款金额:”,JLabel.LEFT);
JTextField loanAmount=新的JTextField(10);
loanAmtPanel.add(loanAmtLabel);
loanAmtPanel.add(loanAmount);
//贷款类别小组
JPanel loantypanel=新的JPanel();
JLabel loanTypeLabel=新的JLabel(“贷款类型:”,JLabel.LEFT);
字符串[]项={“7年为5.35%,“15年为5.5%,“30年为5.75%,”;
JComboBox loanTypeBox=新的JComboBox(项目);
loanTypePanel.add(loanTypeLabel);
loantypanel.add(loanTypeBox);
//计算按钮面板
JPanel calculatePanel=新的JPanel();
JButton calcButton=新JButton(“计算付款”);
addActionListener(这个);
calculatePanel.add(calcButton);
//每月付款小组
JPanel paymentPanel=新的JPanel();
JLabel paymentLabel=新的JLabel(“每月付款:”,JLabel.LEFT);
JLabel paymentOutput=新JLabel(“计算付款”);
paymentPanel.add(paymentLabel);
paymentPanel.add(paymentOutput);
//查看付款面板
JPanel viewPayments=新的JPanel();
JTextArea paymentList=新的JTextArea(“”,17,27);
paymentList.setEditable(false);
paymentList.setLineWrap(true);
查看付款。添加(付款清单);
//添加面板以赢得面板
JPanel win=新的JPanel();
BoxLayout框=新的BoxLayout(win,BoxLayout.Y_轴);
win.setLayout(box);
win.add(loanAmtPanel);
win.add(loanTypePanel);
win.add(calculatePanel);
win.add(paymentPanel);
win.add(查看付款);
加(赢);
//使窗口可见
setVisible(真);
}
私有void setLookAndFeel(){
试一试{
UIManager.setLookAndFeel(
“com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel”
);
}捕获(异常exc){
//忽略
}
}
已执行的公共无效操作(操作事件e){
//清除付款清单
paymentList.setText(“”);
//从textfield获取贷款金额
字符串金额=loanAmount.getText();
loanAmt=Double.valueOf(amount).doubleValue();
//从combobox中查找要使用的mortgate数组
Object obj=loantypox.getSelectedItem();
String loanSelected=obj.toString();
//基于抵押数组运行计算
//七年期贷款
如果(贷款选择等于(“7年,5.35%”){
//计算付款、利息和剩余金额
mortgage1[2]=(loanAmt+(loanAmt*(mortgage1[1]/100))/(mortgage1[0]*12);
双重利息1=(贷款*(抵押1[1]/100))/84;
double Amountramining1=贷款+贷款*(抵押1[1]/100));
//循环支付

对于(int payment=1;payment您正在类的构造函数中重新声明paymentList变量

  JTextArea paymentList = new JTextArea("", 17, 27);
构造函数内的变量“隐藏”了类字段,因此构造函数看不到类字段。此局部变量仅在构造函数内可见(因为它是在构造函数内声明的),并且类字段将保持为空

解决方案:不要在构造函数中重新声明变量。可以在那里初始化它,但不要重新声明它:

  paymentList = new JTextArea("", 17, 27);
更一般地说,你应该经常检查抛出NPE的行上的变量,因为其中一个是空的。如果你看到它是paymentList,你就可以很快识别出我刚才给你看的内容,你就不需要我们的帮助,这也是本论坛的目标——让你能够自己解决问题。

编辑:
另外,请注意,您在代码中多次出现此错误。我将让您查找此错误的其他实例

编辑2:
考虑将JTaTaReA放在JSCRelpANE中。考虑使用一些合适的布局管理器,而不是设置GUI的大小,而是让布局管理器为您这样做。

字段:

JTextArea paymentList;
从未初始化,因此尝试将值设置为“”时为null

这同样适用于
loanAmount

@装满鳗鱼的气垫船在另一个答案中解释了为什么它们没有像你想象的那样被初始化

额外提示:排队

  loanAmt = Double.valueOf(amount).doubleValue();
如果贷款金额为空(或不是有效的double),将引发异常-您需要使用try catch来处理此问题

对于这三行,您必须注释掉这三行,因为您已经声明了它们,只需要赋值

    //JTextField loanAmount = new JTextField(10);       // loanAmount: Already declared, only assignment needed
    loanAmount = new JTextField(10);

    //JComboBox loanTypeBox = new JComboBox(items);     // loanTypeBox: Already declared, only assignment needed
    loanTypeBox = new JComboBox(items);

    //JTextArea paymentList = new JTextArea("", 17, 27);// paymentList: Already declared, only assignment needed
    paymentList = new JTextArea("", 17, 27);
这是最新的代码

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.text.DecimalFormat;

public class MortgageGui extends JFrame implements ActionListener {

    // Set two-places for decimal format
    DecimalFormat twoPlaces = new DecimalFormat("$0.00");

    // Declare variable for calculation
    Double loanAmt;
    double interestRate;
    double monthlyPayment;
    int payment;
    String amount;

    JTextField loanAmount;
    JComboBox loanTypeBox;
    JLabel paymentOutput;
    JTextArea paymentList;

    // Build arrays for mortgages
    double[] mortgage1 = { 7.0, 5.35, 0.0 }; // (years, interest, monthly
                                                // payment)
    double[] mortgage2 = { 15.0, 5.5, 0.0 }; // (years, interest, monthly
                                                // payment)
    double[] mortgage3 = { 30.0, 5.75, 0.0 }; // (years, interest, monthly
                                                // payment)

    public MortgageGui() {

        super("Mortgage Calculator");
        setLookAndFeel();
        setSize(350, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Loan Amount Panel
        JPanel loanAmtPanel = new JPanel();
        JLabel loanAmtLabel = new JLabel("Loan Amount: ", JLabel.LEFT);
        // JTextField loanAmount = new JTextField(10); // loanAmount: Already declared, only assignment needed
        loanAmount = new JTextField(10);
        loanAmtPanel.add(loanAmtLabel);
        loanAmtPanel.add(loanAmount);

        // Loan Type Panel
        JPanel loanTypePanel = new JPanel();
        JLabel loanTypeLabel = new JLabel("Loan Type: ", JLabel.LEFT);
        String[] items = { "7 years at 5.35%", "15 years at 5.5%",
                "30 years at 5.75%" };
        // JComboBox loanTypeBox = new JComboBox(items); // loanTypeBox: Already declared, only assignment needed
        loanTypeBox = new JComboBox(items);
        loanTypePanel.add(loanTypeLabel);
        loanTypePanel.add(loanTypeBox);

        // Calculate Button Panel
        JPanel calculatePanel = new JPanel();
        JButton calcButton = new JButton("Calculate Paytment");
        calcButton.addActionListener(this);
        calculatePanel.add(calcButton);

        // Monthly Payment Panel
        JPanel paymentPanel = new JPanel();
        JLabel paymentLabel = new JLabel("Monthly Payment: ", JLabel.LEFT);
        JLabel paymentOutput = new JLabel("Calculated Payment");
        paymentPanel.add(paymentLabel);
        paymentPanel.add(paymentOutput);

        // View Payments Panel
        JPanel viewPayments = new JPanel();
        // JTextArea paymentList = new JTextArea("", 17, 27); // paymentList: Already declared, only assignment needed
        paymentList = new JTextArea("", 17, 27);
        paymentList.setEditable(false);
        paymentList.setLineWrap(true);
        viewPayments.add(paymentList);

        // Add panels to win Panel
        JPanel win = new JPanel();
        BoxLayout box = new BoxLayout(win, BoxLayout.Y_AXIS);
        win.setLayout(box);
        win.add(loanAmtPanel);
        win.add(loanTypePanel);
        win.add(calculatePanel);
        win.add(paymentPanel);
        win.add(viewPayments);
        add(win);

        // Make window visible
        setVisible(true);
    }

    private void setLookAndFeel() {
        try {
            UIManager
                    .setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Exception exc) {
            // ignore
        }
    }

    public void actionPerformed(ActionEvent e) {

        // Clear payment list
        paymentList.setText("");

        // Get loan amount from textfield
        String amount = loanAmount.getText();
        loanAmt = Double.valueOf(amount).doubleValue();

        // Find which mortgate array to use from combobox
        Object obj = loanTypeBox.getSelectedItem();
        String loanSelected = obj.toString();

        // Run the calculation based on the mortgage arrays

        // 7-year loan
        if (loanSelected.equals("7 years at 5.35%")) {
            // Calculate payment, interest, and remaining
            mortgage1[2] = (loanAmt + (loanAmt * (mortgage1[1] / 100)))
                    / (mortgage1[0] * 12);
            double interest1 = (loanAmt * (mortgage1[1] / 100)) / 84;
            double amountRemaining1 = loanAmt
                    + (loanAmt * (mortgage1[1] / 100));

            // Loop through payments
            for (int payment = 1; payment <= 84; payment++) {

                // Deduct one payment from the balance
                amountRemaining1 = amountRemaining1 - mortgage1[2];

                // Write payment to textArea
                paymentList.append("Payment " + payment + ": $"
                        + twoPlaces.format(mortgage1[2]) + " / "
                        + "Interest: $" + twoPlaces.format(interest1) + " / "
                        + "Remaining: $" + twoPlaces.format(amountRemaining1)
                        + "\n");
            }

        } else {
            // 15-year loan
            if (loanSelected.equals("15 years at 5.5%")) {

                // Calculate payment, interest, and remaining
                mortgage2[2] = (loanAmt + (loanAmt * (mortgage2[1] / 100)))
                        / (mortgage2[0] * 12);
                double interest2 = (loanAmt * (mortgage2[1] / 100)) / 180;
                double amountRemaining2 = loanAmt
                        + (loanAmt * (mortgage2[1] / 100));

                // Loop through payments
                for (int payment = 1; payment <= 180; payment++) {

                    // Deduct one payment from the balance
                    amountRemaining2 = amountRemaining2 - mortgage2[2];

                    // Write payment to textArea
                    paymentList.append("Payment " + payment + ": $"
                            + twoPlaces.format(mortgage2[2]) + " / "
                            + "Interest: $" + twoPlaces.format(interest2)
                            + " / " + "Remaining: $"
                            + twoPlaces.format(amountRemaining2) + "\n");
                }

            } else {
                // 30-year loan

                // Calculate payment, interest, and remaining
                mortgage3[2] = (loanAmt + (loanAmt * (mortgage3[1] / 100)))
                        / (mortgage3[0] * 12);
                double interest3 = (loanAmt * (mortgage3[1] / 100)) / 360;
                double amountRemaining3 = loanAmt
                        + (loanAmt * (mortgage3[1] / 100));

                // Loop through payments
                for (int payment = 1; payment <= 360; payment++) {

                    // Deduct one payment from the balance
                    amountRemaining3 = amountRemaining3 - mortgage3[2];

                    // Write payment to textArea
                    paymentList.append("Payment " + payment + ": $"
                            + twoPlaces.format(mortgage3[2]) + " / "
                            + "Interest: $" + twoPlaces.format(interest3)
                            + " / " + "Remaining: $"
                            + twoPlaces.format(amountRemaining3) + "\n");
                }
            }
        }
    }

    public static void main(String[] arguments) {
        MortgageGui calc = new MortgageGui();
    }
}
import javax.swing.*;
导入java.awt.event.*;
导入java.awt.*;
导入java.text.DecimalFormat;
公共类MortgageGui扩展JFrame实现ActionListener{
//为十进制格式设置两位
DecimalFormat twoPlaces=新的DecimalFormat($0.00”);
//声明用于计算的变量
双l