Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java EE应用程序中显示错误消息时出现意外结果(字段为null时无错误)_Java_Jsp_Jakarta Ee_Jstl - Fatal编程技术网

在Java EE应用程序中显示错误消息时出现意外结果(字段为null时无错误)

在Java EE应用程序中显示错误消息时出现意外结果(字段为null时无错误),java,jsp,jakarta-ee,jstl,Java,Jsp,Jakarta Ee,Jstl,我正在用JavaEE编写一个web应用程序,当我试图显示用户输入的错误时,发现自己得到了一个非常意外的结果 该应用程序构建在JSP/Servlet/Form/Bean模型上。基本上,JSP将数据存储在请求中,并将其传输到servlet。然后servlet将请求原始传输到表单,然后表单读取数据,执行必要的检查并将bean返回给servlet 大多数字段必须具有特定的值,而其他一些字段必须是非空的 我已经编写了错误检测代码来保护输入,但是我发现自己得到了一个非常奇怪的结果: 当字段非空但值不正确(

我正在用JavaEE编写一个web应用程序,当我试图显示用户输入的错误时,发现自己得到了一个非常意外的结果

该应用程序构建在JSP/Servlet/Form/Bean模型上。基本上,JSP将数据存储在请求中,并将其传输到servlet。然后servlet将请求原始传输到表单,然后表单读取数据,执行必要的检查并将bean返回给servlet

大多数字段必须具有特定的值,而其他一些字段必须是非空的

我已经编写了错误检测代码来保护输入,但是我发现自己得到了一个非常奇怪的结果:

  • 当字段非空但值不正确(例如,位于00:00-23:59范围之外的一小时)时,它会返回正确的错误以及存储在HashMap中的错误消息,我可以在JSP中访问它
  • 但是,当字段为null时,它返回消息,可能也将其存储在HashMap中(我知道这一点,因为
    ${!empty errors.dataErrors}
    测试返回true,并且错误字段显示在我的JSP中),但无法访问错误值
我已经搜索了我的代码,但仍然找不到错误的来源。如果有人知道问题出在哪里,这里有一些片段

servlet中的doPost方法:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    NewBookingForm form = new NewBookingForm();
    Booking booking = form.registerBooking(request);
    String VUE;

    request.setAttribute("booking", booking);
    request.setAttribute("errors", form);

    this.getServletContext().getRequestDispatcher(VIEW).forward(request, response);
}
map是NewBookingForm类中的一个字段,在
registerBooking
方法之外声明和初始化,如下
private-map-dataErrors=new-HashMap()
在form类中,我使用此函数获取字段值:

private static String getFieldValue(HttpServletRequest request, String fieldName)
{
    String value = request.getParameter(fieldName);
    if (value == null || value.trim().length() == 0){return null;}
    else{return value;}
}
通过一系列调用获取值后,如
String fieldDepartureStation=getFieldValue(请求,FIELD\u departition\u STATION)在我的方法开始时,我然后使用像这样的try/catch块检查它们

try
{validation.departureStation(fieldDepartureStation);}
catch(Exception e)
{setDataErrors(FIELD_DEPARTURE_STATION, e.getMessage());}
如果数据必须具有特定的值范围,或者必须是非空的,那么validation类中的validations方法就有点不同

在前一种情况下,它们是这样的:

public void departureTime(String time) throws Exception
{
    if (!validationRETime(time)) { throw new Exception("Please input a time with the hh:mm pattern"); }
}
....
private boolean validationRETime(String strTime)
{
    String regExp = "^([01][0-9]|2[0-3])[:][0-5][0-9]$"; // hh:mm
    if (strTime.matches(regExp))
    {
        return true;
    }
    else
    {
        return false;
    }
}
而在后一种情况下,它们只是

public void departureStation(String station) throws Exception
{
    if (station.equals(null)) { throw new Exception("Please input a departure station"); }
}
最后,在我的JSP中,我使用以下代码显示错误:

<c:if test="${!empty errors.dataErrors}">
     <p>Errors</p>
     <c:forEach items="${errors.dataErrors}" var="message">
           <p><c:out value="${message.value}" /></p>
     </c:forEach>
</c:if>

错误

当我故意输入不正确的值时,它确实会显示错误段落,但当错误字段为非null但值不正确时,
只会循环并显示错误消息。因此,对于只需要非null的字段,我永远不会得到消息(但我确实得到了错误)

这些都是我能想到的可能出错的事情,但我还没有发现它们在哪里,如果有人能帮助我,我将非常高兴

public class Test {

    public static void main(String[] args) {
        Test  c = new Test ();
        try {
            c.departureTime("30:30");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        try {
            c.departureTime(null);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public void departureTime(String time) throws Exception {
        if (!validationRETime(time)) {
            throw new Exception("Please input a time with the hh:mm pattern");
        }
    }

    private boolean validationRETime(String strTime) {
        String regExp = "^([01][0-9]|2[0-3])[:][0-5][0-9]$"; // hh:mm
        if (strTime.matches(regExp)) {
            return true;
        } else {
            return false;
        }
    }
}

您将通过运行上述代码来解决问题。简单地说,您需要确保exp.getMessage()始终具有值。要解决此问题,您可能需要调整departureTime()方法以提供更细粒度的异常处理。

问题出在您的
departureStation
方法中:-

public void departureStation(String station) throws Exception
{
    if (station.equals(null)) { 
        throw new Exception("Please input a departure station"); 
    }
}
null
值的测试本身会触发
NPE
。因此,只要对
station=null
执行
station.equals(null)
,就会抛出一个
NPE
异常,然后将其传播到调用方。因此,甚至不会执行
if
块。因此,您不会像您所想的那样抛出
异常

现在,还要注意,抛出的
NPE
不包含任何
消息。因此,
e.getMessage()
将在其上返回
null

现在,让我们回到调用方:-

try
{validation.departureStation(fieldDepartureStation);}
catch(Exception e)
{setDataErrors(FIELD_DEPARTURE_STATION, e.getMessage());}
在这里,您正在进行
异常处理
世界上最大的犯罪活动,使用
异常
的catch块。由于
Exception
是所有异常的超类,因此它将以相同的方式处理所有异常。因此,它使用
NPE
,并将其传递给
setDataErrors()

因此,您当然会得到错误,但是值
e.getMessage()
将为
null
。这就是为什么你没有看到任何信息。您甚至可以通过
记录上面
catch块中
e.getMessage()
的值来测试它


解决方案???

只需更改您的
null
检查此项:-

if (station == null) { 
    throw new Exception("Please input a departure station"); 
}

一切都会好起来的。我认为,你将不得不在你所有的方法中进行这种改变。始终使用
=
运算符执行
空检查。

您所说的
是什么意思?无法访问错误的值。
?您如何访问错误?当你尝试它时会发生什么?严格来说,什么也不会发生:它什么也不写。但是所有的应用程序都可以工作,没有Java异常发生。编辑:我还添加了代码Iuse,以显示我忘记首先添加到问题中的错误
if(station.equals(null))
将在
station
null
时抛出
NPE
。这意味着,您的
抛出的新异常(..)
将根本不会执行。尝试将测试更改为:-
if(station==null)
。非常感谢,我尝试了您的建议,它确实有效。但它提出了一个新问题:对于.equals(null)测试,由于异常冲突(NPE与我定义的异常冲突),catch块不会执行;那么为什么在我的地图中仍然会有一个错误,这样最终我的JSP会显示错误的文本块呢?@FrenchFigaro。。嗯,NPE也是
Exception
的一个子类。因此,当抛出它时,您可以在
Exception
catch块中捕获它(这是您不应该捕获