Java 使用.getText()从文本字段获取文本时出现问题
我正在构建一个应用程序,用于验证来自Amazon Web服务s3文件的登录, 它可以验证登录是否正确,但当我试图获取用户在文本字段中输入的文本时,问题就出现了 这是构建UI的代码部分:Java 使用.getText()从文本字段获取文本时出现问题,java,swing,amazon-web-services,amazon-s3,Java,Swing,Amazon Web Services,Amazon S3,我正在构建一个应用程序,用于验证来自Amazon Web服务s3文件的登录, 它可以验证登录是否正确,但当我试图获取用户在文本字段中输入的文本时,问题就出现了 这是构建UI的代码部分: public class UserInterface extends JFrame implements ActionListener { JLayeredPane pane; JFrame f; JTextField usernameLogin; JTextField passwordLogin; UserI
public class UserInterface extends JFrame implements ActionListener {
JLayeredPane pane;
JFrame f;
JTextField usernameLogin;
JTextField passwordLogin;
UserInterface ui;
JButton loginButton;
static String loggedInAs = null;
static AmazonS3 s3;
static boolean tryToLogin = false;
public UserInterface() {
JLayeredPane pane = new JLayeredPane();
JTextField usernameLogin = new JTextField("Username...",20);
usernameLogin.setLocation(650,200);
usernameLogin.setSize(500, 30);
usernameLogin.setVisible(true);
pane.add(usernameLogin, 1, 0);
JTextField passwordLogin = new JTextField("Password...",20);
passwordLogin.setLocation(650,240);
passwordLogin.setSize(500, 30);
passwordLogin.setVisible(true);
pane.add(passwordLogin, 1, 0);
JButton loginButton = new JButton("login");
loginButton.setLocation(650,290);
loginButton.setSize(75, 20);
loginButton.addActionListener(this);
loginButton.setVisible(true);
pane.add(loginButton, 1, 0);
this.add(pane);
}
我不认为问题来自那里,但我可能错了。
该程序的下一部分是一个逻辑处理器,它与服务器一起使用AmazonS3验证登录。它在main()中
当我调用“ui.usernameLogin.getText()”或“ui.passwordLogin.getText()”时,总是会出现空指针异常
具体来说,
java.lang.NullPointerException
at UserInterface.main(UserInterface.java:102)
您正在构造函数中定义一个局部变量
JTextField usernameLogin=newjtextfield(“用户名…”,20)代码>
这与JTextField usernameLogin不同代码>声明这永远不会初始化,并且是null
,这就是为什么会出现NullPointerException
改变这个
public class UserInterface extends JFrame implements ActionListener {
JLayeredPane pane;
JFrame f;
JTextField usernameLogin;
JTextField passwordLogin;
UserInterface ui;
JButton loginButton;
public UserInterface() {
LayeredPane pane = new JLayeredPane();
JTextField usernameLogin = new JTextField("Username...",20);
usernameLogin.setLocation(650,200);
usernameLogin.setSize(500, 30);
usernameLogin.setVisible(true);
pane.add(usernameLogin, 1, 0);
JTextField passwordLogin = new JTextField("Password...",20);
passwordLogin.setLocation(650,240);
passwordLogin.setSize(500, 30);
passwordLogin.setVisible(true);
pane.add(passwordLogin, 1, 0);
JButton loginButton = new JButton("login");
loginButton.setLocation(650,290);
loginButton.setSize(75, 20);
loginButton.addActionListener(this);
loginButton.setVisible(true);
pane.add(loginButton, 1, 0);
this.add(pane);
}
到
几点建议:
不要扩展JFrame
而是使用引用(组合优于继承),不要在顶级类ActionListener
中实现,而是使用匿名类
或内部类
一些编码:
(retVal==true&&retVal2==true)
将其更改为(retVal&&retVal2)
管理异常,从不空白捕获
} catch (AmazonServiceException ase) {
}
根据您提供的代码,您从未将对象分配给ui
变量。此外,usernameLogin
是在本地创建的,并且没有分配给类的成员变量,这意味着您试图将空值传递到它不接受空值的地方。您需要做一些错误处理,以检查空值。还可以使用==运算符检查空值。.equals比较对象
if(ui.username.getText() != null){
boolean retVal = splitResult[0].equals(ui.usernameLogin.getText());
boolean retVal2 = splitResult[1].equals(ui.passwordLogin.getText());
}
如何使局部变量为静态?静态?你为什么希望它是静态的?据我所知,你可以从我代码中的任何地方访问静态的东西,我需要能够从main()访问textField@OP:我想你需要认真阅读实例和类成员,以及如何引用它们。您正在发布的代码中执行一些广泛的名称阴影。@user1952381我更新了hope-answer希望它对您有所帮助,如果有帮助,请不要忘记将某些答案标记为正确。如何将其分配给classes成员变量?谢谢,顺便问一下。你有没有用一个使用变量表的工具调试过它?找出哪个调用返回null非常有用。例如,您确定lineValue得到的值不是null吗?
} catch (AmazonServiceException ase) {
}
if(ui.username.getText() != null){
boolean retVal = splitResult[0].equals(ui.usernameLogin.getText());
boolean retVal2 = splitResult[1].equals(ui.passwordLogin.getText());
}