我刚开始使用IntelliJ IDE学习Java。我知道有点C#所以逻辑是有道理的,但到目前为止有一件事我无法克服它。
如何从控制台读取?在C#中,您可以使用Console.ReadLine()
轻松阅读人类输入的内容。在Java中,System.console().readLine();
对我不起作用并抛出NullPointerException
。
我在这里缺少什么?
答案 0 :(得分:61)
大多数IDE使用javaw.exe
而不是java.exe
来运行Java代码(请参见下图)。
这两个程序之间的区别在于javaw
运行Java代码而不与当前终端/控制台(这对GUI应用程序有用),并且因为没有关联的控制台窗口{ {1}}返回System.console()
。因为null
最终为System.console().readLine()
而导致null.readLine()
,因为NullPointerException
没有null
方法(也没有任何方法/字段)。
但仅仅因为没有关联的控制台,这并不意味着我们无法与readLine()
进程通信。此过程仍然支持标准输入/输出/错误流,因此IDE处理(以及我们也通过它)可以通过javaw
,System.in
和System.out
使用它们。
这样IDE可以有一些标签/窗口,让它模拟控制台。
例如,当我们运行Eclipse中的代码时:
System.err
我们将看到结果
表明尽管package com.stackoverflow;
public class Demo {
public static void main(String[] args) throws Exception {
System.out.println("hello world");
System.out.println(System.console());
}
}
没有关联的控制台(最后为javaw.exe
),IDE仍能够处理来自null
进程javaw
的标准输出的数据并显示System.out.println("hello world");
。
让用户传递信息以处理使用标准输入流(hello world
)。但由于System.in
很简单in
而InputStream
s用于处理二进制数据,因此它没有方法可以让它轻松正确地读取数据文本(特别是如果可以涉及编码)。这就是为Stream
和Readers
添加到Java的原因。
因此,为了让生活更轻松,让应用程序从用户那里读取数据作为文本,您可以将此流包装在Writers
之类的Reader
中,这样您就可以使用BufferedReader
读取整行} 方法。不幸的是,这个类不接受readLine()
而是Streams
,因此我们需要某种适配器来模拟Reader并能够将字节翻译成文本。但这就是Reader
存在的原因。
因此,允许应用程序从输入流中读取数据的代码看起来像
InputStreamReader
为了避免将 magic 转换为允许将Stream转换为Reader,您可以使用BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Hello. Please write your name: ");
String name = br.readLine();
System.out.println("Your name is: "+name);
类,这意味着将数据作为文本从Streams和Readers中读取。
这意味着你可以简单地使用
Scanner
从用户读取数据(将由IDE使用标准输入流模拟的控制台发送)。
答案 1 :(得分:1)
java.util.Scanner
您正在寻找API。
答案 2 :(得分:0)
如果你真的需要Console对象,你可以从命令行编译你的类。首先在我的java文件中,第一个语句是package com.inputOutput;
转到项目“src
”文件夹并将其编译为:“javac com/inputOutput/Password.java
”“com
”和“inputOutput
”是文件夹(包)。在src
文件夹中运行您的班级文件
java com.inputOutput.Password
“。它为我工作了。
答案 3 :(得分:0)
您可以使用Jframe。
JFrame frame = new JFrame("titile");
// prompt the user to enter their code
String code = JOptionPane.showInputDialog(frame, "promt here");