【问题标题】:Why doesn't my String check code work为什么我的字符串检查代码不起作用
【发布时间】:2014-01-13 04:15:42
【问题描述】:

我正在尝试制作一个 JFrame,它检查放置在 JTextField 中的文本是否与 .txt 文件中的信息相同。 如果正确,它会检查 JPasswordField 中的信息是否与 .txt 文件中的信息匹配。

public void actionPerformed(ActionEvent e)
{
    if(e.getSource() == button)
    {
        if(!username.getText().equals("") && passIsGood())
        {
            try
            {
                Scanner reader = new Scanner(new File("users.txt"));
                reader.useDelimiter("\t|\n");
                reader.nextLine();
                while(reader.hasNextLine())
                {
                    if(reader.next().equals(username.getText()))
                    {
                        //Username is correct, now checks for password:
                        System.out.println("Username passed");      
                        if(reader.next().equals(passToString()))
                        {
                            //Username & Password are correct
                            System.out.println("Password passed");
                            break;
                        }
                    } else if(!reader.hasNextLine())
                    {
                        wrongInfo();
                    } else
                    {
                        reader.nextLine();
                    }
                }
                reader.close();
                frame.dispose();
            } catch(Exception ex)
            {
                JOptionPane.showMessageDialog(null, ex);
            }
        } else
        {
            JOptionPane.showMessageDialog(null, "Please enter a valid Username and Password");
        }
    }
}

private static String passToString()
{
    String passString = new String(password.getPassword());
    return passString;
}

我知道用户名通过了,但我觉得 .equals(passToString()) 可能会导致问题。 文本文件如下所示: 用户名密码 测试测试 test2 thetest3

请注意,每个字段之间的空格是制表符,因此我的分隔符使用 ("\t|\n");

【问题讨论】:

  • users.txt 中的每一秒字段之后都是一个新行
  • 为什么需要在顶部调用 reader.nextLine()?
  • @sasankad 我的 .txt 文件中的第一行用于格式化,它说“用户名密码”作为第一行指示如何写出其余部分,我想忽略它

标签: java string swing java.util.scanner


【解决方案1】:

您的文本字段中包含的字符串可能包含一些不需要的字符。使用字符域(所有作为符号的 ascii 值)来摆脱这些。试试这个:

import java.io.File;
import java.util.Scanner;

public class readUsers {

    public static void main(String[] args) {
        try {
            Scanner reader = new Scanner(new File("users.txt"));
            reader.useDelimiter("\t|\n");

            String username = "username";
            String password = "password";

            for (int i = 0; i < username.length(); i++) {
                //replace possible unwanted characters
                if (username.charAt(i) < 33 || username.charAt(i) > 126)
                    username = username.replace(Character.toString(username.charAt(i)), "");
            }

            for (int j = 0; j < password.length(); j++) {
                //replace possible unwanted characters
                if (password.charAt(j) < 33 || password.charAt(j) > 126)
                    password = password.replace(Character.toString(password.charAt(j)), "");
            }

            while (reader.hasNextLine()) {
                String user = reader.next();
                String pass = reader.next();

                //if username equals the user in the textfile, check if password equals the pass in the file
                 if (user.equals(username)) {
                    System.out.println("username passed!");
                    if (pass.equals(password))
                        System.out.println("password passed!");
                }   
            }

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

我的文本文件如下所示:
用户名密码
用户名2密码

附:这是我的第一个 StackOverFlow 答案,如果我做错了什么,请纠正我 :)

【讨论】:

  • 感谢您的回复!不过我找到了一个更简单的解决方案,原来我的问题是用户名在开始时包含一个看似不起眼的 \n,所以我只是使用了 String.trim();解决方法,谢谢!
  • 我不知道是哪个字符导致了问题 ;)
猜你喜欢
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
相关资源
最近更新 更多