【问题标题】:Java console readPassword() returns nonsense charactersJava 控制台 readPassword() 返回无意义字符
【发布时间】:2012-12-30 21:55:54
【问题描述】:

对于 Java 的 Console 对象,尤其是 readPassword() 方法,我遇到了可笑的困难。

我有当前代码要读入一个密码,两次,然后循环直到两个密码相同:

do {
    dbPasswordOne = userInput.readPassword("Enter a password for the bookstall: ");
    System.out.println(dbPasswordOne.toString());
    dbPasswordTwo = userInput.readPassword("Re-enter the password: ");
    System.out.println(dbPasswordTwo.toString());
} while (!Arrays.equals(dbPasswordOne, dbPasswordTwo));

在我看来,这应该可以正常工作(打印只是为了调试目的。但是,这是我在 Linux 终端中得到的输出:

Enter a password for the bookstall: 
[C@9e4acce
Re-enter the password: 
[C@40d0d75

无论我输入什么,每次我运行它总是相同的两个无意义的字符串。任何帮助将不胜感激。

【问题讨论】:

  • “dbPasswordOne 和 dbPasswordTwo 的类型是什么?看起来您正在尝试打印一个对象(不是字符串)。

标签: java io passwords


【解决方案1】:

您正在通过char[] 呼叫toString()。自动装箱 char[] 并且您看到的字符串是它的参考名称。您必须将您的 char[] 转换为 String

试试System.out.println(new String(dbPasswordOne));

【讨论】:

  • 你怎么知道是char[]toString() return 中有什么告诉你吗?
  • new String() 不需要,而且自动装箱与它无关。
【解决方案2】:

不要使用dbPasswordTwo.toString()toString(),因为这会打印出参考名称。只需删除toString()

PrintWriterSystem.out 有一个println(char[]) 方法,然后调用该方法。这会打印出每个字符,并且不会隐式调用toString() 方法。

【讨论】:

    【解决方案3】:

    这是一个完整的示例,改编自我怀疑您可能正在使用的“Console.readPassword()”示例:

    /*
     * REFERENCE:
     * http://www.java2s.com/Tutorial/Java/0120__Development/Readpasswordfromconsole.htm
     *
     * SAMPLE OUTPUT:
     * Enter your login: abc
     * Enter your old password:
     * You entered: def...
     */
    import java.io.Console;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class X {
    
      public static void main(String args[]) throws IOException {
    
        Console c = System.console();
        if (c == null) {
          System.err.println("No console.");
          System.exit(1);
        }
    
        String login = c.readLine("Enter your login: ");
        char[] oldPassword = c.readPassword("Enter your old password: ");
    
        String sPassword = new String(oldPassword);
        System.out.println ("You entered: " + sPassword + "...");
      }
    }
    

    注意String sPassword = new String(oldPassword); 这一行。这会将 char[] 数组转换为可打印的字符串。

    '希望有帮助!

    【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2011-03-27
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多