1

estoy haciendo un ejercicio de clase que es básicamente una pequeña calculadora a la que se le añaden dos dígitos y con 4 opciones hace la operación correspondiente.

introducir la descripción de la imagen aquí

El código es el siguiente:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="../CSS/normalizer.css">
    <link rel="stylesheet" type="text/css" href="../CSS/estilos.css">
    <title>Calculadora</title>
</head>
<body>
    <form>
        <%
            //jueves 4 de octubre de 2018
            Calendar fechaActual = Calendar.getInstance();
            int diaMes = fechaActual.get(Calendar.DAY_OF_MONTH);
            int anio = fechaActual.get(Calendar.YEAR);

            Month mes = LocalDate.now().getMonth();
            DayOfWeek diaSemana = LocalDate.now().getDayOfWeek();
            // Obtiener nombre del mes
            String nombreMes = mes.getDisplayName(TextStyle.FULL, new Locale("es", "ES"));
            String nombreDiaSemana = diaSemana.getDisplayName(TextStyle.FULL, new Locale("es", "ES"));


        %>
        <fieldset>
            <legend>CALCULADORA BASICA</legend>
            <p><strong><%=nombreDiaSemana%> <%=diaMes%> de <%=nombreMes%> de <%=anio%></strong></p>
            <br>
            <label>Primer Operando</label><input name="num1" type="text">
            <label>Segundo Operando</label><input name="num2" type="text">
            <br>
            <br>
            Sumar<input name="operacion" value="Sumar" type="radio" checked="checked">  
            Restar<input name="operacion" value="Restar" type="radio">  
            Multiplicar<input name="operacion" value="Multiplicar" type="radio">    
            Dividir<input name="operacion" value="Dividir" type="radio">
            <br>
            <br>
            <%

                String mensajeOperacion = "";

                if (request.getParameter("operacion").equals("Sumar")) {
                    mensajeOperacion = "El resultado de " + 
                    Integer.parseInt(request.getParameter("num1"))+ " + " + 
                    Integer.parseInt(request.getParameter("num2")) + " = " + 
                    (Integer.parseInt(request.getParameter("num1"))+Integer.parseInt(request.getParameter("num2")));
                }else if(request.getParameter("operacion").equals("Restar")){
                    mensajeOperacion = "El resultado de " + 
                    Integer.parseInt(request.getParameter("num1"))+ " - " + 
                    Integer.parseInt(request.getParameter("num2")) + " = " + 
                    (Integer.parseInt(request.getParameter("num1"))-Integer.parseInt(request.getParameter("num2")));
                }else if(request.getParameter("operacion").equals("Multiplicar")){
                    mensajeOperacion = "El resultado de " + 
                    Integer.parseInt(request.getParameter("num1"))+ " * " + 
                    Integer.parseInt(request.getParameter("num2")) + " = " + 
                    (Integer.parseInt(request.getParameter("num1"))*Integer.parseInt(request.getParameter("num2")));
                }else if(request.getParameter("operacion").equals("Dividir")){
                    if(Integer.parseInt(request.getParameter("num2"))!=0){
                        mensajeOperacion = "El resultado de " + 
                        Integer.parseInt(request.getParameter("num1"))+ " / " + 
                        Integer.parseInt(request.getParameter("num2")) + " = " + 
                        (Integer.parseInt(request.getParameter("num1"))/Integer.parseInt(request.getParameter("num2")));
                    }else{
                        mensajeOperacion = "No se puede dividir entre 0";
                    }
                }

            %>
            <%=mensajeOperacion%>
            <button type="reset" name="limpiar" value="Limpiar">Limpiar</button>
            <button type="submit" name="botonCookie" value="Menu"><a id="menuCookies" href="<%=request.getContextPath()%>/index.html">Menú</a> </button>
        </fieldset>
    </form>
</body>
</html>

Cuando ejecuto me sale siempre el error: Estado HTTP 500 – Internal Server Error introducir la descripción de la imagen aquí

Como veis es un programa muy básico, pero que no sé por qué no funciona correctamente. Los inputs deben ser de tipo radio.

Paco
  • 63
  • 1
  • 9
  • fijate si Sumar está con mayusculas o minusculas en tu codigo! Parece que viene por ahí el tema ... – Nacho Zve De La Torre Oct 08 '18 at 16:10
  • ¿A qué te refieres con "cuando ejecuto"? ¿Llegas a poner datos en el formulario? En todo caso mira esta pregunta para ver qué significa el error: https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados/42978#42978. – SJuan76 Oct 08 '18 at 16:14
  • Tanto en el value de los inputs como en los if la primera letra siempre la pongo en mayúscula, si es a eso a lo que te refieres. – Paco Oct 08 '18 at 16:15
  • @NachoZveDeLaTorre No es eso en absoluto. – SJuan76 Oct 08 '18 at 16:15
  • Cuando ejecuto, me refiero al darle a run en NetBeans para que se abra la aplicación. Si comento el código que está entre las etiquetas , la aplicación se ejecuta como la muestro en la primera imagen subida, pero obviamente no hace nada. – Paco Oct 08 '18 at 16:18

2 Answers2

1

Cuando invocas una página web, se le pueden pasar valores como parámetros por distintas formas.

Tu JSP coge esos valores y trabaja con ellos, pero en ningún momento comprueba que el usuario haya enviado parámetros. Así que obtiene un valor null y, al intentar usar alguna propiedad o método de un valor null, obtienes un NullPointerException.

Y cuando cargas la página por primera vez para ver el formulario, naturalmente no le estás pasando parámetros (ya que éstos se los pasas mediante el form que aún no has presentado1) y falla2.

La solución es que tu código tiene que tratar el caso en que no haya parámetros, que es la primera carga de la página.

En tu caso, una forma de control muy básico (que no controla muchos posibles errores, pero al menos te soluciona el caso de la primera visualización) sería:

<%
    String mensajeOperacion = "";
    if (request.getParameter("operacion") != null) {
       if (request.getParameter("operacion").equals("Sumar")) {
          ...
       }
    }
%>
<%=mensajeOperacion%>

De manera más general, cuando recojas entradas de un usuario debes siempre controlar y validar los datos, y no pensar que serán correctos3.


1De hecho hay formas de pasarle los parámetros en la URL, pero tampoco quiero liarte.

2Igual piensas que como el código Java está debajo del form, se ejecuta después. No. Llega una petición, se ejecuta el JSP por completo y devuelve un HTML. Ese HTML es lo que ves en el navegador y se ejecuta completamente por separado; al enviar el form es una nueva petición que se ejecuta independientemente de la primera.

3¿Qué pasa si el usuario te pone una operación pero no llena los valores de los operandos? ¿O si pone "SJuan76" en el campo num1? Porque te aseguro que lo hacen...

SJuan76
  • 10,771
  • 5
  • 17
  • 31
0

Hola el error esta en esta parte

 <fieldset>
       <legend>CALCULADORA BASICA</legend>
       <p><strong><%=nombreDiaSemana%> <%=diaMes%> de <%=nombreMes%> de <%=anio%>   </strong></p>
    <br>
    <label>Primer Operando</label><input name="num1" type="text">
    <label>Segundo Operando</label><input name="num2" type="text">
    <br>
    <br>
    Sumar<input name="operacion" value="Sumar" type="radio" checked="checked">  
    Restar<input name="operacion" value="Restar" type="radio">  
    Multiplicar<input name="operacion" value="Multiplicar" type="radio">    
    Dividir<input name="operacion" value="Dividir" type="radio">
    <br>
    <br>

todos los input tiene el atributo name con el valor operacion, por eso da error, en este caso debes usar request.getParameterValues("operacion") pero te devuelve un arreglo de tipo string[]

Csharls
  • 335
  • 1
  • 8