这不应该工作吗?显示来自servlet的错误消息

时间:2012-12-12 05:12:16

标签: java jsp servlets error-handling try-catch

所以,我有一个servlet作为接受URL的RSS feed项目的一部分,然后它继续做一些超出这个特定问题的其他事情。如果用户提交(通过表单)空白或其他无效的URL,我有以下代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

    URL feedURL = null;

    try {
        feedURL = new URL(request.getParameter("url"));
    } catch (MalformedURLException e) {
        PrintWriter out = response.getWriter();
        out.println("Please go back and submit a valid URL.");
    } 

现在我没有获得MalformedURLException,而是获得了NullPointerException。我是以正确的方式来做这件事的吗?我是否必须将错误消息指向某个更具体的错误消息才能找到用户?我会更好地使用response.sendError()或其他方法,比如客户端的JavaScript吗?

如果重要,请求来自JSP。

与往常一样,StackOverflow社区,请提前感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

try {
    feedURL = new URL(request.getParameter("url"));
} catch (MalformedURLException e) {
    PrintWriter out = response.getWriter();
    out.println("Please go back and submit a valid URL.");
    return;
} 

你应该在catch块中做一个返回。 Nullpointer可能会从下一行抛出,因为feedURL将为null。如果这不是原因,请分享您获得的Nullpointer跟踪。

在我看来,你应该从catch块转发到错误页面。

答案 1 :(得分:1)

当您创建java.net.URL类的实例时,其构造函数可以抛出MalformedURLException。当URL无效时会发生这种情况。

抛出时,不是因为主机已关闭( 503 ),或者URL路径指向丢失的文件( 404 ) 。

常见错误包括: - 1.退出协议 2.指定无效的协议 例如www://stackoverlfow.com 3.排除':'字符

如果出现以下情况,则不会抛出

MalformedURLException: -

  1. 主机名无效。例如www.stack-overlfow.com
  2. 路径无效。例如http://www.microsoft.com/company_secrets.html
  3. 如果URL字符串不可解析或包含不受支持的协议,它也会抛出MalformedURLException

    您收到NullPointerException表示请求中缺少名为“url”的参数。仔细检查您的请求将始终以“url”作为参数。

    有很多方法可以告知客户有问题。

    您可以使用`response.sendError()之类的

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    
    if (request.getParameter("important_parameter") == null) {
      response.sendError(response.SC_BAD_REQUEST, "Missing URL parameter");
    }
    

    我不知道如何使用Javascript来处理它。但是,您也可以转发到同一页面或错误页面,并将消息作为提及错误的参数传递。

答案 2 :(得分:0)

看起来你正在URL构造函数中获取NPE,它尝试解析作为param发送的字符串。您可能希望在调用URL构造函数之前添加null检查。 此外,您还可以在提交请求时进行验证,将ant参数添加到名为“url”的请求URL中。由于您使用的是doGet,因此您必须通过点击某个网址发送请求。