0

所以,我有一个 servlet 作为 RSS 提要项目的一部分,它接受一个 URL,然后它继续做一些超出这个特定问题的其他事情。如果用户(通过表单)提交空白或其他无效的 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 社区,提前感谢您的帮助。

4

3 回答 3

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 将为空。如果这不是原因,请分享您获得的 Nullpointer 跟踪。

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

于 2012-12-12T05:15:36.793 回答
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

MalformedURLException如果 URL 字符串不可解析或包含不受支持的协议,它也会抛出 a 。

您得到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. 但是,您也可以转发到同一页面或错误页面,并将消息作为提及错误的参数传递。

于 2012-12-12T08:09:26.327 回答
0

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

于 2012-12-12T05:41:19.873 回答