2009-12-16 2 views
5

questo:NullPointerException in readLine di Console()

Console c = System.console(); 
     String readline; 
     String u = c.readLine("%s", "args"); 

getta una NullPointerException. Eppure la firma del metodo è:

public String readLine(String fmt, Object... args) 

Perché è questa eccezione essere gettato?

risposta

17
Console c = System.console(); 

c null?

Doc:

pubblica consolle Consolle statico()

restituisce l'oggetto Console unica associato all'attuale Java macchina virtuale, se presente.

Resi: la console di sistema, se disponibile, altrimenti null.

+0

Non è un metodo di fabbrica? – andandandand

+0

Oh ... come posso ottenere un oggetto console da Netbeans? – andandandand

+0

Non ho provato a utilizzare questa chiamata in Netbeans, ma è possibile utilizzare il debug remoto in Eclipse per aggirare questo: http://stackoverflow.com/questions/104254/java-io-console-support-in-eclipse-ide/105403 # 105403 Sono sicuro che è possibile fare qualcosa di simile in Netbeans. – McDowell

4

NullPointerException è un RuntimeException, che significa che non deve essere dichiarato nella firma del metodo.

+1

È una risposta alla domanda sul perché viene lanciata l'NPE, dato che la firma non specifica alcuna eccezione. Mentre leggevo la domanda, questo sembrava essere il principale punto di confusione dell'interrogante. –

2

È c null in qualche modo?

A proposito, la tua istruzione readLine è equivalente a c.readLine("args") - è quello che intendi?

1

C'è qualcosa di strano nello snippet di codice. Dichiari una variabile chiamata "readline" ma non la inizializzi e non la usi.

È possibile che nel programma in qualche modo si usi questa variabile senza inizializzarla? (a lunga distanza, lo so)

+0

questo è un esempio da manuale. – andandandand

2

System.console() ha restituito null, è l'unica riga in quello snippet di codice che potrebbe aver generato un'eccezione di puntatore nullo.

4

via: http://www.codeguru.com/forum/showthread.php?t=487190 per i dettagli

Prima di usare un metodo vale sempre la pena di leggere i documenti API su ciò che il metodo fa. Per esempio documentazione per il metodo console() fare:

Quota:

Se una macchina virtuale ha una console dipende dalla sottostante piattaforma e anche dal modo in cui la macchina virtuale è invocato. Se la macchina virtuale è avviato da una riga di comando interattivo senza reindirizzare i flussi di input e output standard quindi la sua console esisterà e sarà tipicamente essere collegato alla tastiera e visualizzazione da cui è stata lanciata la macchina virtuale . Se la macchina virtuale viene avviata automaticamente, ad esempio da un programma di pianificazione dei lavori in background, allora in genere lo non dispone di una console.

Se questa macchina virtuale ha una console allora è rappresentata da un unico istanza di questa classe che può essere ottenuti chiamando il metodo System.Console(). Se non è disponibile alcuna console , allora una chiamata restituirà null. Di tale metodo restituirà null.

Se si tenta di richiamare il programma dalla riga di comando utilizzando il comando java, allora avrà una console e il metodo non dovrebbe restituire null. Di tale metodo restituirà null.

In alternativa, utilizzando la classe Scanner funziona all'interno del vostro IDE:

Scanner sc = new Scanner(System.in);

0

Perché System.console() è null nell'IDE che si sta utilizzando. Prova java.util.Scanner invece:

import java.util.Scanner; 
Scanner s = new Scanner(System.in); 
String u = s.nextLine();