2014-02-12 74 views
1
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); 
    } 
} 

爲什麼我在上面的代碼中遇到異常?控制檯類java

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

任何人都可以幫我嗎?

+2

您是否閱讀過'System.console()'的javadoc? –

+3

看起來'c'是'null',這意味着你不是在像cmd這樣的控制檯中執行Java應用程序,而是在IDE控制檯中執行。 –

+0

[系統控制檯,如果有,否則爲空。](http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#console%28%29) – Brian

回答

0

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

0

根據API: 如果虛擬機從一個交互式命令行開始,而不重定向標準輸入和輸出流,則其控制檯將存在,並且通常會連接到啓動虛擬機的鍵盤和顯示器。如果虛擬機是自動啓動的,例如通過後臺作業調度程序,那麼它通常沒有控制檯。你

也可以找到一些額外的信息System.console() returns null

0

Luiggi門多薩的答案說明你的問題非常好。也就是說,在IDE中,System.console()函數返回NULL

但是,如果你想沒有任何異常運行該Java程序被拋出,只要打開控制檯或命令提示符,然後鍵入以下兩個命令和程序的運行就像如下圖所示:

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

這是假設您的PATH中有java命令。另外,請不要忘記將path/to/class/file更改爲您的系統上的.class文件(不是.java文件)所在的實際路徑。我在Linux上試過了,它工作正常。

1

的Javadoc說爲什麼它返回null

控制檯

公共靜態console控制檯()

返回與當前Java虛擬機相關聯的唯一Console對象(如果有)。

返回:系統控制檯,如果有的話,否則爲空

由於: 1.6

IntelliJ IDEA的回報與System.console空太,所以你唯一可以做的事情是創建兩個方法(一個用於讀取線,一個密碼,因爲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參考,以避免重複調用控制檯(),這是syncronized方法(在我的源代碼至少)

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

如果您正在運行在Eclipse中你的應用程序,我建議你使用java.util.Scanner來讀取輸入。