Java 为什么这个对象是空的?

Java 为什么这个对象是空的?,java,object,null,Java,Object,Null,我对Java相当陌生,我得到了一个“Java.lang.NullPointerException” 这两个文本字段都返回为null,我不知道为什么我使用了.setText(),它显示在文本字段中 基本上,我要做的是在velocityTextView中传递值并将其传递给 返回文本视图 我尝试了returnTextView.setText(velocityTextView.getText()) 我将此代码放在actionPerformed()方法中 我被卡住了,我想得到一些指导 import jav

我对Java相当陌生,我得到了一个“Java.lang.NullPointerException”

这两个文本字段都返回为null,我不知道为什么我使用了.setText(),它显示在文本字段中

基本上,我要做的是在velocityTextView中传递值并将其传递给 返回文本视图

我尝试了
returnTextView.setText(velocityTextView.getText())
我将此代码放在
actionPerformed()
方法中

我被卡住了,我想得到一些指导

import java.awt.Color;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class kinematica implements ActionListener {

    public JPanel totalGui;
    public JLabel progTitle;
    public JButton enterBtn;
    public JTextField velocityTextField, returnTextField;


    public static void main(String[] args) {

        showGui();

    }

    public JPanel createContentPane() {

        //  GUI panel to contain the elements that make GUI
        JPanel totalGui = new JPanel();
        totalGui.setLayout(null);


        // Title Label 
        JLabel progTitle = new JLabel("Linear Motion 1D");
        progTitle.setLocation(10, 10);
        progTitle.setSize(500, 30);
        progTitle.setHorizontalAlignment(JLabel.LEFT);
        totalGui.add(progTitle);



        // Buttons
        JButton enterBtn = new JButton("Enter");
        enterBtn.setLocation(100, 200);
        enterBtn.setSize(100, 50);
        enterBtn.addActionListener(this);
        totalGui.add(enterBtn);


        // text fields
        JTextField velocityTextField = new JTextField(20);
        velocityTextField.setLocation(100, 50);
        velocityTextField.setSize(80, 30);
        velocityTextField.setText("Velocity =");
        totalGui.add(velocityTextField);

        JTextField returnTextField = new JTextField();
        returnTextField.setLocation(100, 100);
        returnTextField.setSize(80, 30);
        returnTextField.setText("test1");
        totalGui.add(returnTextField);


        totalGui.setOpaque(true);
        return totalGui;

    }


    public void actionPerformed(ActionEvent e) {

        returnTextField.getText();

        System.out.println(velocityTextField);

    }

    public static void showGui() {

        JFrame window = new JFrame("Kinematica");
        kinematica demoWindow = new kinematica();
        window.setContentPane(demoWindow.createContentPane());

        window.setSize(1500, 1000);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

createContentPane
函数中删除所有类名

当您说
JLabel progTitle
时,您是在为函数创建一个局部变量,因此不是在谈论成员变量。这就造成了程序员的情况,这就造成了您的问题

因此,当您稍后访问成员变量时,该变量未被触及,因此
null

改变

JTextField returnTextField = new JTextField();


在该函数的此行和类似行中。

createContentPane
函数中删除所有类名

当您说
JLabel progTitle
时,您是在为函数创建一个局部变量,因此不是在谈论成员变量。这就造成了程序员的情况,这就造成了您的问题

因此,当您稍后访问成员变量时,该变量未被触及,因此
null

改变

JTextField returnTextField = new JTextField();


在该函数的这行和类似行中。

问题是,您正在隐藏变量。将这两个'JTextField'声明为实例字段

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    JTextField velocityTextField = new JTextField(20);
    /*...*/

    JTextField returnTextField = new JTextField();
然后,在
createContentPane
方法中重新声明它们

相反,请删除本地声明,例如

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    velocityTextField = new JTextField(20);
    /*...*/

    returnTextField = new JTextField();

问题是,您正在隐藏您的变量。将这两个'JTextField'声明为实例字段

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    JTextField velocityTextField = new JTextField(20);
    /*...*/

    JTextField returnTextField = new JTextField();
然后,在
createContentPane
方法中重新声明它们

相反,请删除本地声明,例如

public JTextField velocityTextField, returnTextField;

public JPanel createContentPane() {
    /*...*/

    // text fields
    velocityTextField = new JTextField(20);
    /*...*/

    returnTextField = new JTextField();
正如Karthik所说:

createContentPane
中删除类名。这看起来像是:

public JPanel createContentPane() {

    //  GUI panel to contain the elements that make GUI
    totalGui = new JPanel();
    totalGui.setLayout(null);


    // Title Label 
    progTitle = new JLabel("Linear Motion 1D");
    progTitle.setLocation(10, 10);
    progTitle.setSize(500, 30);
    progTitle.setHorizontalAlignment(JLabel.LEFT);
    totalGui.add(progTitle);



    // Buttons
    enterBtn = new JButton("Enter");
    enterBtn.setLocation(100, 200);
    enterBtn.setSize(100, 50);
    enterBtn.addActionListener(this);
    totalGui.add(enterBtn);


    // text fields
    velocityTextField = new JTextField(20);
    velocityTextField.setLocation(100, 50);
    velocityTextField.setSize(80, 30);
    velocityTextField.setText("Velocity =");
    totalGui.add(velocityTextField);

    returnTextField = new JTextField();
    returnTextField.setLocation(100, 100);
    returnTextField.setSize(80, 30);
    returnTextField.setText("test1");
    totalGui.add(returnTextField);


    totalGui.setOpaque(true);
    return totalGui;

}
为什么要这样做?因为在方法中将类名放在变量名前面时,是在声明局部变量。相反,您希望使用已声明的公共字段。为了避免再次遇到这个问题,我建议对实例变量使用下划线,而对局部变量不使用下划线。因此,您可以使用
\u enterBtn
而不是
enterBtn
来检查自己的未来。

正如Karthik所说:

createContentPane
中删除类名。这看起来像是:

public JPanel createContentPane() {

    //  GUI panel to contain the elements that make GUI
    totalGui = new JPanel();
    totalGui.setLayout(null);


    // Title Label 
    progTitle = new JLabel("Linear Motion 1D");
    progTitle.setLocation(10, 10);
    progTitle.setSize(500, 30);
    progTitle.setHorizontalAlignment(JLabel.LEFT);
    totalGui.add(progTitle);



    // Buttons
    enterBtn = new JButton("Enter");
    enterBtn.setLocation(100, 200);
    enterBtn.setSize(100, 50);
    enterBtn.addActionListener(this);
    totalGui.add(enterBtn);


    // text fields
    velocityTextField = new JTextField(20);
    velocityTextField.setLocation(100, 50);
    velocityTextField.setSize(80, 30);
    velocityTextField.setText("Velocity =");
    totalGui.add(velocityTextField);

    returnTextField = new JTextField();
    returnTextField.setLocation(100, 100);
    returnTextField.setSize(80, 30);
    returnTextField.setText("test1");
    totalGui.add(returnTextField);


    totalGui.setOpaque(true);
    return totalGui;

}

为什么要这样做?因为在方法中将类名放在变量名前面时,是在声明局部变量。相反,您希望使用已声明的公共字段。为了避免再次遇到这个问题,我建议对实例变量使用下划线,而对局部变量不使用下划线。因此,您可以使用
\u enterBtn
而不是
enterBtn
来检查自己的未来。

这非常有效,谢谢!我知道现在出了什么问题。刚接触java,有很好的学习经验。非常好,谢谢!我知道现在出了什么问题。刚接触java,有很好的学习经验。我完全明白这是怎么回事。从现在起,我肯定会使用下划线。我肯定会看到发生了什么。从现在起,我肯定会使用下划线。@karthikt可以随意将其添加到您的回答中。@karthikt可以随意将其添加到您的回答中。@karthikt可以随意将其添加到您的回答中。@karthikt可以在+1:+后2秒添加到您的回答中。)