System.console()NullPointerException

时间:2016-01-01 10:03:16

标签: java

这是我的代码:

System.out.println("Enter Username : ");
    String unm=System.console().readLine();

    System.out.println("Enter Password: ");
    char[] pwd=System.console().readPassword();

    System.out.println("Welcome : "+""+" Your password is "+ new String(pwd));

为什么我要纠结这个错误?

输入用户名:

  

线程中的异常" main" Cons.main(Cons.java:13)

中的java.lang.NullPointerException

5 个答案:

答案 0 :(得分:2)

来自javadoc:

  

返回与当前Java关联的唯一Console对象   虚拟机,如果有的话。如果没有与之关联的控制台   javadoc,指向的行是对null对象的方法调用,   因此例外。

如何启动申请?

  

虚拟机是否具有控制台取决于   底层平台以及虚拟的方式   机器被调用。如果虚拟机是从一个启动的   交互式命令行,无需重定向标准输入和   输出流然后它的控制台将存在并且通常是   连接到键盘和显示虚拟机的显示器   已启动,推出。如果虚拟机自动启动,则为   例如,后台作业调度程序,它通常没有   控制台。

获取输入的最佳方式是,

如果您想从标准输入中读取用户名,可以使用以下代码:

try {
    System.out.print("Enter Username: ");
    InputStreamReader streamReader = new InputStreamReader(System.in);
    BufferedReader bufferedReader = new BufferedReader(streamReader);
    String username = bufferedReader.readLine();
} catch (IOException e) {
    e.printStackTrace();
}

答案 1 :(得分:2)

这是因为System.console()返回null。官方文件说明(粗体是我的强调):

  

public static Console console()

     

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

     

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

您可以看到here

答案 2 :(得分:0)

您应该使用BufferedReaderScanner类来从控制台读取输入。

<强>的BufferedReader:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ReadConsoleSystem {
  public static void main(String[] args) {

    System.out.println("Enter something here : ");

    try{
        BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        String s = bufferRead.readLine();

        System.out.println(s);
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

  }
}

<强>扫描仪:

import java.util.Scanner;

public class ReadConsoleScanner {
  public static void main(String[] args) {

      System.out.println("Enter something here : ");

       String sWhatever;

       Scanner scanIn = new Scanner(System.in);
       sWhatever = scanIn.nextLine();

       scanIn.close();            
       System.out.println(sWhatever);
  }
}

答案 3 :(得分:0)

String unm=System.console().readLine();

您应首先在system.console进行空检查。在没有控制台关联的平台上,此应用程序将因空指针异常而死亡。

对任何控制台是否可用进行空检查。如果没有,请使用扫描仪阅读

    String userName;
    char[] password;
    Scanner scanner = null;
    Console console = System.console();
    if(console == null){
        scanner = new Scanner(System.in);
        System.out.println("Enter username: ");
        userName = scanner.next();
        //Read Password as well
    }else{
        System.out.println("Enter username: ");
        userName = console.readLine();
        //Read password as well
    }

注意:

  • 控制台的一个优点,特别是在读取密码时,它不会显示在屏幕上。使用扫描仪,您的密码将显示在屏幕上。
  • 以上代码段仅供演示之用。

答案 4 :(得分:0)

如果仅需要输入用户名,则链接http://stackoverflow.com/questions/26078106/system-console-gives-nullpointerexception-in-netbeans提供的答案就足够了。但是,您还需要安全输入密码。为此,您提供的代码非常好。您只需要编译项目并在 Console Terminal 中运行它,而不是您的 IDE 。例如。如果您使用的是 Windows Netbeans ,请通过单击Run > Build Project菜单项来构建项目。这将创建一个与项目名称相同的.jar文件。现在打开一个cmd窗口,导航到.jar文件所在的路径,然后通过键入java -jar YourProjectName.jar命令执行项目(将YourProjectName替换为项目名称) )。