Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where to put super() or this() in my classes

I have a Servlet class I made to handle functions I don't want to repeat on every Servlet I have. I'm still working on it (i.e. it still only loads index.jsp and not other files).

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);
    }
}

My Servlet is as follows

@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");
    }
}

I am however, unable to compile my code:

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

update

Ok, removing void on my constructors and calling super(); got the must call first portion to go away, but it's still saying I have to call super despite that it's already being called.

update

I don't understand the responses below.... they keep saying to put super() within the constructor, when my examples already show that being done, AND it is the first line of code. Any other advice would be appreciated.

Any thoughts?

This is now a non-issue. I do not know what resolved this issue, but with multiple changes and rebuilding my app from the ground up I am no longer experiencing this issue

like image 387
Webnet Avatar asked Dec 18 '11 21:12

Webnet


2 Answers

Your problem was:

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

It seems like VerifyError symptom. Cleaning and rebuilding the project should resolve the problem, see also:

  • VerifyError means the bytecode is invalid
  • Perform a "clean and build"

Furthermore, you can remove your constructors with a super() single-line. The JVM does it for you with a default (implicitly hidden) constructor. So, clear these unnecessary lines:

public MyServlet () {
    super();
}

and

public EditServlet () {
    super();
}

You would have to explicitly call super() if you needed to write additional business lines in the constructor.

like image 190
falsarella Avatar answered Oct 13 '22 10:10

falsarella


And how does the constructor of Library.MyServlet look?. As a note, if the super keyword is to be used in a constructor, it has to be on the first line. Same thing for this.

Have you tried deleting the empty constructor? Apparently, you're not using it.

like image 31
Óscar López Avatar answered Oct 13 '22 09:10

Óscar López