system.console()nullpointerexception

ldioqlga  于 2021-07-03  发布在  Java
关注(0)|答案(5)|浏览(298)

这是我的密码:

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));

为什么我会犯这个错误?
输入用户名:
cons.main处的线程“main”java.lang.nullpointerexception中出现异常(cons。java:13)

iibxawm4

iibxawm41#

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 the password as well
    }
    else{
        System.out.println("Enter username: ");
        userName = console.readLine();
        // Read the password as well
    }

注:
控制台的一个优点是,特别是在读取密码时,它不会显示在屏幕上。使用扫描仪,您的密码将显示在屏幕上。
上面的代码片段用于演示。

pokxtpni

pokxtpni2#

从javadoc:
返回与当前java虚拟机关联的唯一控制台对象(如果有)。如果没有与javadoc相关联的控制台,那么指向的行是对空对象的方法调用,因此是异常。
如何启动应用程序?
虚拟机是否有控制台取决于底层平台以及调用虚拟机的方式。如果虚拟机是从交互命令行启动的,而没有重定向标准的输入和输出流,那么它的控制台将存在,并且通常会连接到启动虚拟机的键盘和显示器。如果虚拟机是自动启动的,例如由后台作业调度器启动,那么它通常没有控制台。
最好的方法是,
如果要从标准输入中读取用户名,可以使用以下代码:

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();
}
euoag5mw

euoag5mw3#

如果您只需要输入用户名,system.console()提供的答案在netbeans中给出一个nullpointerexception就足够了。
但是,您还需要安全地输入密码。为此,您提供的代码非常好。您只需编译项目并在控制台或终端(而不是ide)中运行它。
e、 例如,如果您使用的是windows和netbeans,请单击菜单项run来构建您的项目→ 生成项目。这将创建一个 .jar 与项目同名的文件。
现在打开一个 cmd 窗口中,导航到 .jar 找到文件,然后通过键入 java -jar YourProjectName.jar 命令(替换 YourProjectName 项目名称)。

jckbn6z7

jckbn6z74#

那是因为 System.console() 正在返回null。官方文件指出(我要强调粗体):
公共静态控制台()
返回与当前java虚拟机关联的唯一控制台对象(如果有)。
返回:系统控制台(如果有),否则为空。
你可以在这里看到。

k3bvogb1

k3bvogb15#

你应该使用 BufferedReader 或者 Scanner 类从控制台读取输入。
缓冲读取器:

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);
  }
}

相关问题