【问题标题】:Where to put super() or this() in my classes在我的课程中放置 super() 或 this() 的位置
【发布时间】:2012-01-23 04:57:33
【问题描述】:

我创建了一个 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 尽管它已经被调用了。

更新

我不明白下面的回复....他们一直说将super() 放在构造函数中,而我的示例已经显示已完成,并且它是第一行代码。任何其他建议将不胜感激。

有什么想法吗?

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

【问题讨论】:

  • 如果你得到一个错误,指出它必须是第一个,你是否尝试将它放在构造函数中?
  • 构造函数没有任何返回类型。删除 MyServlet 和 EditServlet 之前的空白。代码可以编译吗?
  • 您在使用 Netbeans 吗?我记得一个关于这个 Netbeans 怪癖的类似问题:stackoverflow.com/questions/6560988/… 换句话说,你的构建很脏。例如,您已经通过文件资源管理器而不是 IDE 手动重命名/移动了项目中的类文件。顺便说一句,这些构造函数是完全没有必要的。没有它们,servlet 应该也能正常工作(当然,在你清理了肮脏的类路径之后)。
  • @BalusC - 是的,我正在使用 Netbeans。我已经尝试重构文件并重命名类和东西,但它并没有解决问题。我还删除了项目并重新创建了它。
  • 如果你创建一个全新的项目,只有一个简单的 Hello World @WebServlet,它在 doGet() 中基本上是 response.getWriter().write("Hi")?总而言之,这绝对是 Netbeans 的问题。哦,请使用@nickname 通知其他人关于评论回复不是他们自己的帖子。我没有收到您最后评论的通知。

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


【解决方案1】:

你的问题是:

method: &lt;init&gt; signature: ()V) Constructor must call super() or this()

看起来像VerifyError 症状。清理和重建项目应该可以解决问题,另请参阅:


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

public MyServlet () {
    super();
}

public EditServlet () {
    super();
}

如果您需要在构造函数中编写额外的业务线,则必须显式调用super()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @Webnet 不清楚,因为在您的代码中它读取extends Library.MyServlet,但您显示的代码是MyServlet。如果相同,则尝试在EditServlet的第一行写super(),或者删除EditServlet构造函数
    • MyServlet 是库包的一部分,我不确定我是否理解不清楚的地方。即使我删除EditServlet 上的构造函数,MyServlet 上仍然有错误
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      只需清理并构建... 这是一个构建问题,您的课程现在完全正常。有时,当您更正代码时,IDE 只会重新编译部分代码,而不是整个代码。一个干净的构建应该可以解决问题

      【讨论】:

        【解决方案5】:

        如果你使用this()super(),它必须是构造函数的第一行

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

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

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

        并制作其他适合的私有构造函数。

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

        【讨论】:

        • is我的构造函数的第一行,看我的代码:-\
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多