控制台类java

时间:2014-02-12 20:02:15

标签: java

import java.io.Console; 

public class Talk {
    public static void main(String[] args) {
        Console c = System.console();
        String pw;
        System.out.print("password: ");
        pw = c.readLine();
        System.out.println("got " + pw);
    }
}

为什么我在上面的代码中遇到异常?

password: Exception in thread "main" java.lang.NullPointerException
    at Talk.main(Talk.java:8)

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:2)

Javadoc说它为什么返回null

  

控制台

     

public static Console console()

     

返回与当前Java虚拟机关联的唯一Console对象(如果有)。

     

返回:系统控制台(如果有)否则为null

     

自:   1.6

Intellij IDEA也会使用System.console返回null,因此您唯一能做的就是创建两个方法(一个用于读取行,一个用于密码,因为System.console具有readPassword方法),这有助于您避免出现问题切换到IDE到生产。

public static String readLine() throws IOException
{
    if (System.console() != null)
    {
        return System.console().readLine();
    }
    else
    {
        return new BufferedReader(new InputStreamReader(System.in)).readLine();
    }
}

public static char[] readPassword() throws IOException
{
    if (System.console() != null)
    {
        return System.console().readPassword();
    }
    else
    {
        return readLine().toCharArray();
    }
}

我选择保留char []方式为readPassword,但如果你想要,你可以将它转换为字符串。

你可以在内存中保留System.console引用,以避免双重调用同步的console()方法(至少在我的源代码中)

public static String readLine() throws IOException
{
    Console console = System.console();
    if (console != null)
    {
        return console.readLine();
    }
    else
    {
        return new BufferedReader(new InputStreamReader(System.in)).readLine();
    }
}

public static char[] readPassword() throws IOException
{
    Console console = System.console();
    if (console != null)
    {
        return console.readPassword();
    }
    else
    {
        return readLine().toCharArray();
    }
}

答案 1 :(得分:1)

来自System#console javadoc:

  

返回与当前Java虚拟机关联的唯一Console对象(如果有)。

     

<强>返回

     

系统控制台(如果有),否则为“null”。

如果要使用System#console,则必须从Windows CMD或Linux控制台等控制台执行Java应用程序。如果您碰巧从IDE运行此应用程序,例如Eclipse,Netbeans,IntelliJ等,您将获得null值,因为它们不是真正的控制台。

如果您碰巧使用Eclipse,可以参考此Q / A使其在Eclipse中运行:java.io.Console support in Eclipse IDE

答案 2 :(得分:0)

根据API: 如果从交互式命令行启动虚拟机而不重定向标准输入和输出流,则其控制台将存在,并且通常将连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如后台作业调度程序,那么它通常没有控制台。

您还可以找到一些其他信息System.console() returns null

答案 3 :(得分:0)

Luiggi Mendoza的答案很好地解释了你的问题。也就是说,在IDE中,System.console()函数返回NULL

但是,如果要在不抛出任何异常的情况下运行此Java程序,只需打开控制台或命令提示符并键入以下2个命令,程序就会如下所示运行:

>cd path/to/class/file
>java -cp . Talk
password: 325
got 325

这假设您java中有PATH命令。另外,请不要忘记将path/to/class/file更改为系统中.class文件(非.java文件)所在的实际路径。我在Linux上试过它并且工作正常。

答案 4 :(得分:0)

如果您在Eclipse中运行您的应用程序,我建议您使用java.util.Scanner来读取输入。