Dúvidas sobre correção de erro java.lang.NullPointerException

Bom dia a todos,

Estou fazendo um curso de Jsp + Servlets e estou encontrando dificuldades em um dos exercícios que foi apresentado, gostaria de tentar sanar uma dúvida na correção do mesmo com os colegas. O meu objetivo é conseguir ler o conteúdo de um arquivo .txt, exibi-lo em uma página jsp de forma que eu consiga fazer um crud com ela.

Segue abaixo a minha classe Properties.

`

package model;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.TreeMap;

/**
 * CLASSE QUE REPRESENTA A MINHA REGRA DE NEGÓCIO - faz o carregamento do conteúdo do arquivo e    depois salva as alterações nele
* @author ALLINONE
*
*/
public class Properties {

// private static final String FILE_NAME = "c:/Bruno/properties.txt";
private static final String FILE_NAME = "e:/properties.txt";
// essa coleção properties serve para mapear chaves a valores
private static java.util.Properties props;


/**
 * METODO RESPONSAVEL POR INSTANCIAR O OBJETO properties E CARREGAR AS INFORMAÇÕES DELE
 * NO OBJETO properties.
 */
static {
	
	props = new java.util.Properties();

	try {
		
		props.load(new FileInputStream(FILE_NAME));
	}
	catch(IOException e) {
		
		e.printStackTrace();
	}
}

private Properties() {
	
}


/**
 * TEM POR OBJETIVO RETORNAR O CONTEÚDO DO ARQUIVO PROPERTIES.TXT
 * @return string como chave e string como valor
 */
public static Map<String, String> getProperties() {
	
	Map<String, String> map = new TreeMap<String, String>();
	Enumeration<Object> e = props.keys();
	
	while(e.hasMoreElements()) {
		
		String key = (String) e.nextElement();
		String value = props.getProperty(key);
		map.put(key, value);
	}
	
	return map;
}


/**
 * REMOVE OS DADOS DESEJADOS NO PROPERTIES E RECRIA ELE NOVAMENTE CONTENDO OS DADOS
 * @param key
 * @throws IOException
 */
public static void delete(String key) throws IOException {
	
	props.remove(key);
	props.store(new FileOutputStream(FILE_NAME), "");
}

/**
 * SALVA OS DADOS DESEJADOS NO PROPERTIES E RECRIA ELE NOVAMENTE CONTENDO OS NOVOS DADOS
 * @param key
 * @param value
 * @throws IOException
 */
public static void save(String key, String value) throws IOException {
	
	props.setProperty(key, value);
	props.store(new FileOutputStream(FILE_NAME), "");
}

/**
 * RETORNA UMA STRING COM BASE NA CHAVE QUE EU PASSO
 * @param key
 * @return
 */
public static String getValue(String key) {
	
	return props.getProperty(key);
}
}

`

Servlet para listar as informações do arquivo e depois envia-lo para a página jsp.

`

package servlet;

import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model.Properties;


@WebServlet("/List")
public class ListServlet extends HttpServlet {


private static final long serialVersionUID = 1L;



/**
 * 
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	// pegando o conteúdo das propriedades
	Map<String, String> props = Properties.getProperties(); 
	
	// o servlet coloca esse atributo "properties" na request, para que o jsp possa ler ele mais tarde
	// a request é um atributo que cria uma comunicação entre o servlet e o jsp, fazendo com que através de uma var
	// o conteúdo possa ser compartilhado. Nesse caso, o conteúdo do Map props poderá ser usado pelo jsp.
	request.setAttribute("props", props); 
	
	//fazendo um direcionamento através do forward para a página list.jsp
	request.getRequestDispatcher("list.jsp").forward(request, response);
}

}
`

Página Jsp a qual deverá exibir as informações para o usuário

`

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Propriedades</title>
</head>

    <body>

	<%
		@SuppressWarnings("unchecked")
		// estou lendo aqui os atributos enviados pelo servlet.
		Map<String, String> props = (Map<String, String>) request.getAttribute("props");
	%>

		<CENTER><H1>Propriedades</H1></CENTER>

		<a href="Edit">Criar nova propriedade</a>
		<br><br>
		
		<table border="1" width="100%">
			<tr>
				<td align="center"><strong>Propriedade</strong></td>
				<td align="center"><strong>Valor</strong></td>
				<td colspan="2"></td>
			</tr>

			<% for(Map.Entry<String, String> entry : props.entrySet()) { %>
			<tr>
				<td align="center"><%=entry.getKey()%></td>
				<td align="center"><%=entry.getValue()%></td>
				<td align="center"><a href="Edit?key=<%=entry.getKey()%>">Editar</a></td>
				<td align="center"><a href="Delete?key=<%=entry.getKey()%>">Excluir</a></td>
			</tr>
			<% } %>

		</table>
     </body>
     </html>

`

Quando eu executo a aplicação o seguinte erro tem sido exibido:

`

dez 10, 2016 12:01:00 PM org.apache.tomcat.util.digester.SetPropertiesRule begin
ADVERTÊNCIA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to      'org.eclipse.jst.jee.server:Aula06_Integrando_Servlet_e_JSP' did not find a matching property.
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Server version:        Apache Tomcat/8.0.32
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Server built:          Feb 2 2016 19:34:53 UTC
 dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
 INFORMAÇÕES: Server number:         8.0.32.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: OS Name:               Windows 7
 dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: OS Version:            6.1
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Architecture:          amd64
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Java Home:             C:\Program Files\Java\jre1.8.0_92
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: JVM Version:           1.8.0_92-b14
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: JVM Vendor:            Oracle Corporation
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: CATALINA_BASE:         C:\Users\ALLINONE\Google Drive\CURSOS\SOFTBLUE\ Java Web com     Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: CATALINA_HOME:         C:\Program Files\Apache Software Foundation\Tomcat 8.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dcatalina.base=C:\Users\ALLINONE\Google    Drive\CURSOS\SOFTBLUE\ Java Web com Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dcatalina.home=C:\Program Files\Apache Software Foundation\Tomcat   8.0
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dwtp.deploy=C:\Users\ALLINONE\Google Drive\CURSOS\SOFTBLUE\   Java Web com Servlets e JSPs\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Djava.endorsed.dirs=C:\Program Files\Apache Software   Foundation\Tomcat 8.0\endorsed
dez 10, 2016 12:01:00 PM org.apache.catalina.startup.VersionLoggerListener log
INFORMAÇÕES: Command line argument: -Dfile.encoding=UTF-8
dez 10, 2016 12:01:00 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFORMAÇÕES: Loaded APR based Apache Tomcat Native library 1.1.34 using APR version 1.5.1.
dez 10, 2016 12:01:00 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFORMAÇÕES: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
dez 10, 2016 12:01:01 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFORMAÇÕES: OpenSSL successfully initialized (OpenSSL 1.0.1q 3 Dec 2015)
dez 10, 2016 12:01:01 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["http-apr-8080"]
dez 10, 2016 12:01:01 PM org.apache.coyote.AbstractProtocol init
INFORMAÇÕES: Initializing ProtocolHandler ["ajp-apr-8009"]
 dez 10, 2016 12:01:01 PM org.apache.catalina.startup.Catalina load
INFORMAÇÕES: Initialization processed in 1816 ms
dez 10, 2016 12:01:01 PM org.apache.catalina.users.MemoryUserDatabase createRole
ADVERTÊNCIA: Null or zero length role name specified. The role will be ignored.
dez 10, 2016 12:01:01 PM org.apache.tomcat.util.digester.FactoryCreateRule begin
INFORMAÇÕES: [FactoryCreateRule] Create exception ignored: Null or zero length role name specified. The role will    be ignored.
 dez 10, 2016 12:01:01 PM org.apache.catalina.core.StandardService startInternal
INFORMAÇÕES: Starting service Catalina
dez 10, 2016 12:01:01 PM org.apache.catalina.core.StandardEngine startInternal
INFORMAÇÕES: Starting Servlet Engine: Apache Tomcat/8.0.32
dez 10, 2016 12:01:02 PM org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom
INFORMAÇÕES: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [176]   milliseconds.
dez 10, 2016 12:01:02 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["http-apr-8080"]
dez 10, 2016 12:01:02 PM org.apache.coyote.AbstractProtocol start
INFORMAÇÕES: Starting ProtocolHandler ["ajp-apr-8009"]
dez 10, 2016 12:01:02 PM org.apache.catalina.startup.Catalina start
INFORMAÇÕES: Server startup in 772 ms
dez 10, 2016 12:01:27 PM org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [jsp] in context with path [/Aula06_Integrando_Servlet_e_JSP] threw exception    [An exception occurred processing JSP page /list.jsp at line 28

25: 	<td colspan="2"></td>
26: </tr>
27: 
28: <% for(Map.Entry<String, String> entry : props.entrySet()) { %>
29: 	<tr>
30: 		<td align="center"><%=entry.getKey()%></td>
31: 		<td align="center"><%=entry.getValue()%></td>


Stacktrace:] with root cause
java.lang.NullPointerException
at org.apache.jsp.list_jsp._jspService(list_jsp.java:138)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:438)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:396)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:340)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2500)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2489)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

`

E esse é o conteúdo contido dentro do meu arquivo (Properties.txt )para exibição na página jsp.

p1=v1
p2=v2
p3=v3

Desde já agradeço por qualquer ajuda.

Obrigado a todos, consegui sanar minha dúvida.