Где поставить super () или this () в моих классах - PullRequest
6 голосов
/ 19 декабря 2011

У меня есть класс сервлетов, который я создал для обработки функций, которые я не хочу повторять на каждом имеющемся сервлете.Я все еще работаю над этим (то есть он по-прежнему загружает только 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);
    }
}

Мой сервлет выглядит следующим образом

@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()

update

Хорошо, удалив void из моих конструкторов и вызвав super();, вы получили часть must call first, но он все еще говорит, что мне нужно позвонить в супер, несмотря на то, что он уже вызывается.

update

Я не понимаю ответы ниже .... они продолжаютговоря, чтобы поместить super() в конструктор, когда мои примеры уже показывают, что делается, И это первая строка кода.Любой другой совет будет оценен.

Есть мысли?

Теперь это не проблема.Я не знаю, что решило эту проблему, но с несколькими изменениями и перестройкой приложения с нуля я больше не испытываю эту проблему

Ответы [ 5 ]

11 голосов
/ 23 декабря 2011

Ваша проблема была:

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

Это похоже на VerifyError симптом.Очистка и перестройка проекта должны решить проблему, см. Также:

Кроме того, вы можете удалить свои конструкторы с помощью super() в одну строку.JVM делает это за вас с помощью конструктора по умолчанию (неявно скрытого).Итак, очистите эти ненужные строки:

public MyServlet () {
    super();
}

и

public EditServlet () {
    super();
}

Вам придется явно вызывать super(), если вам нужно написать дополнительные бизнес-строки в конструкторе.

2 голосов
/ 28 декабря 2011

Просто почисти и построй ... Это проблема сборки, ваш класс сейчас совершенно нормальный. Иногда, когда вы исправляете код, IDE просто перекомпилирует части кода, а не весь код. Чистка и сборка должны сделать свое дело

2 голосов
/ 19 декабря 2011

Если Library.MyServlet имеет конструктор, который не принимает аргументов, это должно сработать:

public class EditServlet extends Library.MyServlet {
    public EditServlet () {
        super();
        // Rest of initialization code...
    }
    //...
}
2 голосов
/ 19 декабря 2011

А как выглядит конструктор Library.MyServlet?Как примечание, если ключевое слово super должно использоваться в конструкторе, оно имеет в первой строке.То же самое для this.

Вы пытались удалить пустой конструктор?Видимо, вы не используете его.

1 голос
/ 19 декабря 2011

Если вы используете this() или super(), это должна быть строка first конструктора.

Однако, если вам нужно выполнить какую-то работу до вызова this() или super(), вы можете использовать этот шаблон:

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

или

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

И придумать других частных конструкторов, чтобы удовлетворить.

Методы, которые вы вызываете, не могут быть методами экземпляра, поэтому он работает не во всех случаях, но может помочь вам.

...