Cosa numero 1: NullPointerException è un'eccezione che viene sollevata a runtime, quindi in esecuzione, non in compilazione. Compilazione ed Esecuzione sono due fasi distinte del ciclo di vita di un software, ed è bene averle chiare fin da subito: la prima corrisponde alla "nascita" del programma, la seconda corrisponde alla sua vita (l'esecuzione, appunto, dopo la nascita).

Per quanto riguarda il tuo problema mi sembra alquanto evidente:


codice:
Reader tastiera = null;
BufferedReader bufferTastiera = new BufferedReader(tastiera);

La prima riga impone a null un riferimento... e poi provi a passare questo riferimento (che è nullo!) al costruttore di BufferedReader... in pratica stai dicendo al BufferedReader di leggere dal nulla.

Forse volevi assegnare alla variabile "tastiera" l'oggetto System.in.


Ciao.