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)
任何人都可以帮助我吗?
答案 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来读取输入。