使用.getText()从文本字段获取文本的问题

时间:2013-07-15 17:56:36

标签: java swing amazon-web-services amazon-s3

我正在构建一个验证来自Amazon Web Service s3文件的登录的应用程序, 它可以验证登录正常,但是当我尝试在textField中获取用户输入的文本时会出现问题。

这是构建UI的代码部分:

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);

}

我不认为问题来自那里,但我可能是错的。 该程序的下一部分是一个逻辑处理器,它与服务器一起验证使用Amazon s3进行登录。它位于main()。

        int INFINITE = 1;
    try {
        System.out.println("Downloading an object");
        S3Object object = s3.getObject(new GetObjectRequest("saucyMMO", "logins.txt"));
        System.out.println("Content-Type: "  + object.getObjectMetadata().getContentType());

        while (INFINITE == 1) {
            System.out.println("ran");
            if (tryToLogin == true) {
                System.out.println("ran2");
                INFINITE = 0;
             BufferedReader br = new BufferedReader(new InputStreamReader(object.getObjectContent()));
             String lineValue = null;
             while((lineValue = br.readLine()) != null && loggedInAs == null){
                 String splitResult[] = lineValue.split(",");
                 boolean retVal = splitResult[0].equals(ui.usernameLogin.getText());
                 boolean retVal2 = splitResult[1].equals(ui.passwordLogin.getText());
               if (retVal == true && retVal2 == true) {
                loggedInAs = splitResult[0];
                System.out.println("logged in as : " + loggedInAs);
               }
               else {
                    System.out.println("SPLIT 0 : " + splitResult[0]);
                    System.out.println("SPLIT 1 : " + splitResult[1]);
               }
             }
             }
        }
    } catch (AmazonServiceException ase) {

    } catch (AmazonClientException ace) {

    } catch (IOException e) {
        e.printStackTrace();
    } 

当我调用“ui.usernameLogin.getText()”或“ui.passwordLogin.getText()”时,我总是得到一个空指针异常。

具体地,

java.lang.NullPointerException
at UserInterface.main(UserInterface.java:102)

3 个答案:

答案 0 :(得分:2)

您正在构造函数

中定义局部变量

JTextField usernameLogin = new JTextField("Username...",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);
}

public class UserInterface {
    private JLayeredPane pane;
    private JTextField usernameLogin;
    private JTextField passwordLogin;
    private JButton loginButton; 
    private JTextField usernameLogin; 
    private JFrame frame;

    public UserInterface() {
    usernameLogin = new JTextField("Username...",20);
    usernameLogin.setLocation(650,200);
    usernameLogin.setSize(500, 30);
    usernameLogin.setVisible(true);
    pane.add(usernameLogin, 1, 0);

    passwordLogin = new JTextField("Password...",20);
    passwordLogin.setLocation(650,240);
    passwordLogin.setSize(500, 30);
    passwordLogin.setVisible(true);
    pane.add(passwordLogin, 1, 0);

    loginButton = new JButton("login");
    loginButton.setLocation(650,290);
    loginButton.setSize(75, 20);
    loginButton.addActionListener(this);
    loginButton.setVisible(true);
    pane.add(loginButton, 1, 0);

    frame= new JFrame();
    //configure JFrame

    frame.add(pane);
    frame.pack();//size the frame
    frame.setVisible(Boolean.TRUE);
    }

      //you have to added to some component
      private class MyActionListener implements ActionListener{
             @Override
             public void actionPerformed(ActionEvent evt){
                    //code here
             }
      }

}

一些建议:

不要扩展JFrame而是使用引用(合成而不是继承)并且不要在顶级类ActionListener中实现,而是使用Anonymous classInner Classes

一些编码:

(retVal == true && retVal2 == true)将其更改为(retVal && retVal2)

管理例外,从不空白捕获

} catch (AmazonServiceException ase) {

    } 

答案 1 :(得分:0)

从您提供的代码中,您从未将对象分配给ui变量。此外,usernameLogin是在本地创建的,未分配给类的成员变量

答案 2 :(得分:0)

这意味着您正在尝试将空值传递到不使用空值的某个位置。您需要进行一些错误处理以检查空值。您还可以使用==运算符检查空值。 .equals比较对象。

    if(ui.username.getText() != null){
          boolean retVal = splitResult[0].equals(ui.usernameLogin.getText());
          boolean retVal2 = splitResult[1].equals(ui.passwordLogin.getText());
    }