我可以强制Java方法在某一点返回吗?

时间:2016-08-05 10:40:56

标签: java

我有一个接收数据的servlet,如果数据没问题,它会持续存在。

到目前为止,我尝试了以下内容:

public class ListenerServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

    if(!check1())
    handleErroneousRequest(response, "Error 1");

    if(!check2())
    handleErroneousRequest(response, "Error 2");

    persist();

}

private void handleErroneousRequest(HttpServletResponse response, String errorMessage) {
        response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.flush();
        out.close();
        log.error("Error : " + errorMessage);
    }
}

你可以想象,这并没有像我预期的那样奏效。 有没有比其他一系列更优雅的解决方案呢?我可以强制该方法返回吗?

到目前为止,我正在做这样的事情:

boolean isOK = true;
if(!check1()) {
    isOK = false;
    error = "bla";
}

if(!check2()) {
    isOK = false;
    error = "bla";
}

if(isOK){
    doStuff()
}

2 个答案:

答案 0 :(得分:1)

在您的支票中使用例外是一个想法。您可以抛出一些自定义异常来扩展ServletException(这是servlet中抛出的标准异常)。

您可以在处理程序中捕获该异常,您可以在其中显示自定义内容。不需要if / else,你可以很好地分离什么是异常处理和你的实际代码。

这是一个可以帮助您实现目标的教程:http://www.journaldev.com/1973/servlet-exception-and-error-handling-example-tutorial

检查web.xml中的配置:

<error-page>
  <exception-type>javax.servlet.ServletException</exception-type>
  <location>/AppExceptionHandler</location>
  </error-page>

答案 1 :(得分:0)

为了从Java中的方法返回,您可以使用return语句。

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

    if (!check1()) {
        handleErroneousRequest(response, "Error 1");
        return;
    }

    if (!check2()) {
        handleErroneousRequest(response, "Error 2");
        return;
    }

    persist();

}

然而,至少有两种更好的方法可以解决这一特定任务: if-then-else 例外

使用 if-then-else else-if ,您可以按如下方式编写整个方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

    if (!check1()) {
        handleErroneousRequest(response, "Error 1");
    } else if (!check2()) {
        handleErroneousRequest(response, "Error 2");
    } else {
        persist();
    }
}

对于单语句块,括号是可选的,但为了清楚起见,我将它们包括在内。

解决问题的另一种方法是使用 Exceptions 。在这种情况下,check1check2方法应该抛出异常。任何未捕获的异常都会立即停止方法执行,这也适用于try - 块中的其余语句。因此,异常也可用于控制程序的流程。

但是,如果行为是例外,则应使用异常验证东西期望验证失败,因此从架构的角度来看,应该返回合理的验证结果。

但是,如果您选择使用Exceptions,则使用它们的一种方法如下(假设check1和'check2'抛出异常):

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

    try {
        check1();
        check2();
        persist();
    } catch (MyAwesomeException e) {
         handleErroneousRequest(response, e.getMessage());
    }
}

你也可以选择来自己处理异常(省略try-catch块)并让异常将堆栈冒泡回到calee - 容器 - 并将其配置为@mikibrv已经在他的回答中发布了向用户显示错误消息。如果您无法从程序中的异常中恢复,那么这是特别有用的,唯一明智的做法就是通知用户。

但是,在许多情况下,您可以从异常中优雅地恢复,并且永远不需要通知用户。