私のクラスにsuper()またはthis()を入れる場所

私が持っているサーブレットごとに繰り返さない機能を扱うために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);
    }
}

私のサーブレットは以下の通りです

@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:  signature: ()V) Constructor must call super() or this()

更新

私のコンストラクタで void を削除し、 super(); を呼び出すと最初にコールする必要がありますすでに呼び出されているにも関わらずスーパーを呼び出すことができます。

更新

私は以下の回答を理解していません....彼らはコンストラクタ内に super()を置くことを続けています。他のアドバイスは高く評価されます。

何かご意見は?

これは現在問題ではありません。私は何がこの問題を解決したのか分かりませんが、複数の変更を加えてアプリを再構築しても、もうこの問題は発生しません

6
@BalusC - はい私はNetbeansを使用しています。私はファイルをリファクタリングし、クラスやものの名前を変更しようとしましたが、問題は解決していません。私はまた、プロジェクトを削除し、それを再作成しました。
追加された 著者 Webnet,
私は今/build ディレクトリを削除しましたが、私は Clean and Build
追加された 著者 Webnet,
@BalusC - それでは、 extends myServlet を持ってクラスをインポートする必要があると言っているのですが、 org.webnet.controller.myServlet だけを拡張する必要がありますか?
追加された 著者 Webnet,
@BalusC - Gotcha、私はあなたに通知する気がなかった....私は最初からプロジェクトを作り直し、すべてのコードをコピーして貼り付けた。これはまだ動作しない。私はあなたが提案したことをして、それは動作します.... hrmm ...任意の考えですか?
追加された 著者 Webnet,
私はこの新しいプロジェクトから始め、正確な問題を見つけ出すまで段階的に追加します
追加された 著者 Webnet,
@BalusC - ちょうど library.myServlet でロードしても、どこから来ているのかを正確に知るために、すべてを指定する必要があります。
追加された 著者 Webnet,
@BalusC - なぜあなたはそれが悪いパッケージ名だと言うのですか? MyServletを拡張してインポートするか、インポートを避けるために、 LIbrary.MyServlet を拡張できます。
追加された 著者 Webnet,
@BalusC - 標準のMVC Webアプリケーションでは、パッケージをどのように構造化しますか?あなたのプロフィールは、あなたがJavaをどのように経験しているかを示しています。私はあなたの脳を少し拾いたいと思っています。
追加された 著者 Webnet,
@BalusC - それでは Library.myServlet でしょうか?
追加された 著者 Webnet,
コンストラクタには戻り値の型はありません。 MyServletとEditServletの前にvoidを削除してください。コードはコンパイルされますか?
追加された 著者 JB Nizet,
うーん。上記のとおり、パッケージはすべて小文字である必要があります。 「Java命名規則」リンクをクリックします。
追加された 著者 BalusC,
Java命名規則に準拠していません。すべて小文字ではありません。それは「ドメイン」を表すものではありません。クラス名のように見えます。したがって、このようなパッケージは、通常のJavaプログラマにとって混乱し、誤解を招きます。言語固有のコード規則は、世界の他の国々がコードをすばやく理解し維持できるようにするために非常に重要です。
追加された 著者 BalusC,
依存します。あなたの場合、私は org.webnet.controller.MyServlet か何かで始めるでしょう。
追加された 著者 BalusC,
少なくとも、それらのコンストラクタはすべて削除してください。彼らは全く不要で何も解決しません。私は自分のコードに Library.MyServlet を拡張することについて疑問を抱いています。これは奇妙な命名規則です。これは、 Library が静的クラスとして MyServlet をネストした別のクラスであることを示しています。これは本当ですか?それともパッケージ名が悪いのですか?
追加された 著者 BalusC,
私はあなたを理解していません。あなたは、それをインポートせずに意味ですか?まあ、私には意味がありません。サーブレットクラスに分かりやすい名前をつけて、サーブレットの種類を調べるためにパッケージを前に置く必要はありません。しかし、私たちは途中で行く。あなたの問題を解決してください:)
追加された 著者 BalusC,
基本的に response.getWriter()。write( "Hi")を行う単純なHello World @ WebServlet を1つだけ使用して、 ()?すべてのすべてと、これは間違いなくNetbeansの問題です。ああ、 @nickname を使って、自分以外の投稿に対するコメント返信について他の人に通知してください。あなたの最後のコメントが届かなかった。
追加された 著者 BalusC,
いいえ、解決できません。これは、IDEのプロジェクトの .java ソースファイルに関連付けられていない、ビルドフォルダに存在する .class ファイルです。あなたはファイルシステムレベルでそれをきれいにする必要があります。 /build フォルダ全体(またはNetbeansで呼び出されたものであれば、少なくとも5分間以上使用したことはありません。Eclipseでは少なくとも/bin >)、Netbeansがプロジェクトを再構築できるようにします。
追加された 著者 BalusC,
Netbeansを使っていますか?私はこのNetbeansのクールなことに関する似たような質問を思い出します: stackoverflow.com/questions/6560988/… つまり、ビルドが汚いです。たとえば、IDEではなくファイルエクスプローラでプロジェクト内のクラスファイルの名前を手動で変更したり移動したりしています。それらのコンストラクタは、まったく必要ありません。サーブレットは(あなたがあなたの汚れたクラスパスをきれいにした後で)どれもなくても同じようにうまくいくはずです。
追加された 著者 BalusC,
最初になければならないというエラーが表示された場合は、コンストラクタに最初に入れてみましたか?
追加された 著者 Andrew Marshall,
また、引数のないsuperへの呼び出しは必要ありません。これは暗黙的なものであり、省略することができます。 super() - 少なくとも1つのパラメータがある場合にのみ呼び出しが必要です。
追加された 著者 tichy,

5 答え

あなたの問題は:

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

VerifyError のような症状です。プロジェクトのクリーニングと再構築が問題を解決するはずです。以下も参照してください。


さらに、コンストラクタを super()で一行削除することもできます。 JVMはデフォルトの(暗黙的に隠された)コンストラクターでそれを行います。だから、これらの不要な行をクリアしてください:

public MyServlet() {
    super();
}

そして

public EditServlet() {
    super();
}

コンストラクタにビジネスラインを追加する必要がある場合は、 super()を明示的に呼び出す必要があります。

11
追加された

そして、 Library.MyServlet のコンストラクタはどのように見えますか?注意すべき点として、 super キーワードをコンストラクタで使用する場合は、最初の行に持っているというキーワードがあります。 this と同じです。

空のコンストラクタを削除しようとしましたか?明らかに、あなたはそれを使用していません。

2
追加された
MyServlet はライブラリパッケージに含まれていますが、明確ではないことがわかりません。 EditServlet でコンストラクタを削除しても、 MyServlet にはまだエラーがあります。
追加された 著者 Webnet,
コンストラクタは上に示されています
追加された 著者 Webnet,
@Webnetあなたのコードでは Library.MyServlet を読み込みますが、コードは MyServlet のものであることは明らかではありません。それらが同じ場合は、 EditServlet の最初の行に super()を記述するか、 EditServlet コンストラクタを削除してください
追加された 著者 Óscar López,

Library.MyServlet に引数を取らないコンストラクタがあると仮定すると、これはうまくいきます:

public class EditServlet extends Library.MyServlet {
    public EditServlet() {
        super();
       //Rest of initialization code...
    }
    //...
}
2
追加された

ただきれいにする それはビルドの問題です、あなたのクラスは今、完全に正常です。ときどきコードを修正すると、コード全体ではなくコードの一部のみが再コンパイルされます。きれいでビルドはトリックを行う必要があります

2
追加された

this()または super()を使用する場合は、コンストラクタの最初の行である必要があります。

しかし、 this() super()を呼び出す前に前回の作業を行う必要がある場合は、このパターンを使用できます:

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

または

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

And craft other private constructまたはs to suit.

The methods you call can't be instance methods, so it doesn't wまたはk fまたは all cases, but it may help you.

1
追加された
私のコンストラクタの最初の行は、 です。私のコードを見てください。 - \
追加された 著者 Webnet,