将super()或this()放在我的类中的位置

时间:2011-12-18 21:28:10

标签: java oop java-ee build compiler-errors

我有一个Servlet类来处理我不想在每个Servlet上重复的函数。我还在努力(即它仍然只加载index.jsp而不是其他文件)。

public class MyServlet extends HttpServlet {
    public MyServlet () {
        super();
    }

    public void loadView (HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");

        response.setContentType("text/html;charset=UTF-8");

        System.out.println("MyServlet::LoadView() success");

        dispatcher.forward(request, response);
    }
}

我的Servlet如下

@WebServlet(name = "EditServlet", urlPatterns = {"/content/edit"})
public class EditServlet extends Library.MyServlet {
    public EditServlet () {
        super();
    }

    public void doGet (HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("EditServlet loaded");
    }
}

但是,我无法编译我的代码:

SEVERE: Exception while deploying the app [ContentManagement] : (class: contentmanagement/content/EditServlet, method: <init> signature: ()V) Constructor must call super() or this()

更新

好的,删除我的构造函数上的void并调用super();must call first部分消失,但它仍然说我必须打电话给super,尽管它已被调用。< / p>

更新

我不明白下面的回答......他们一直说要把super()放在构造函数中,当我的例子已经表明已完成时,它是第一行代码。任何其他建议将不胜感激。

有什么想法吗?

现在这不是问题。我不知道是什么解决了这个问题,但是经过多次更改并从头开始重建我的应用程序我不再遇到此问题

5 个答案:

答案 0 :(得分:11)

你的问题是:

method: <init> signature: ()V) Constructor must call super() or this()

似乎是VerifyError症状。清理和重建项目应解决问题,另请参阅:


此外,您可以使用super()单行删除构造函数。 JVM使用默认(隐式隐藏)构造函数为您完成。所以,清除这些不必要的行:

public MyServlet () {
    super();
}

public EditServlet () {
    super();
}

如果您需要在构造函数中编写其他业务行,则必须显式调用super()

答案 1 :(得分:2)

Library.MyServlet的构造函数如何看?请注意,如果要在构造函数中使用super关键字,则 位于第一行。 this也是如此。

您是否尝试删除空构造函数?显然,你没有使用它。

答案 2 :(得分:2)

假设Library.MyServlet有一个不带参数的构造函数,这应该有效:

public class EditServlet extends Library.MyServlet {
    public EditServlet () {
        super();
        // Rest of initialization code...
    }
    //...
}

答案 3 :(得分:2)

干净整洁...... 这是一个构建问题,你的课程现在完全正常。有时,当您更正代码时,IDE只会重新编译代码的一部分而不是整个代码。一个干净的构建应该做的伎俩

答案 4 :(得分:1)

如果您使用this()super(),则必须是构造函数的第一个行。

但是,如果你需要在调用this()super()之前做一些工作,你可以使用这种模式:

public MyClass () {
    this(someStaticMethod());
}

public MyClass () {
    super(someStaticMethod());
}

并制作其他私人建筑师以适应。

您调用的方法不能是实例方法,因此它并不适用于所有情况,但它可能会对您有所帮助。