【问题标题】:Non-static method cannot be referenced from a static context error [duplicate]无法从静态上下文错误中引用非静态方法 [重复]
【发布时间】:2013-09-17 16:43:25
【问题描述】:

我有一个名为 sagum 的类,它有一个名为paint的方法

public void paint(Graphics g) {

    int[] apw1 = null;
    int n1 = 0;
    for (int j = 1; j <= n1; j++) {
        g.drawRect(50, 50, (apw1[j] * 20), 30);
        String[] p = null;
        g.drawString("p" + p[j - 1], (55 + (apw1[j - 1] * 20)), 70);
        g.drawString("" + apw1[j - 1], 50 + (apw1[j - 1] * 20), 100);
    }
    g.drawString("" + apw1[n1], 50 + (apw1[n1] * 20), 100);

}

我想叫它

n1=count+1; 
paint(g);

我得到一个错误

non-static method paint(Graphics) cannot be referenced from a static context

我只是在执行方法后尝试调用它来执行我的方法的图形应用程序(调度算法)。

请帮忙

【问题讨论】:

  • 我没有任何静态上下文
  • 包含你的代码n1=count+1; paint(g);的方法是静态的吗?
  • 调用paint(g)的代码在哪里?那是您的静态上下文。请注意,如果您确实设法调用了 paint 方法,它不会做任何您想做的事情。循环体根本不会执行,因为n1 为 0,j 从 1 开始,但最后一行将生成一个NullPointerException,因为apw1null
  • 不只是写paint(g),而是写this.paint(g),这是它隐含的调用。那么问题出在哪里应该会更明显。你应该问问自己,this 是什么?对象在哪里?例如,如果你在 main 中,你会意识到,“哦!我从来没有创建过这种类型的对象,是吗?”

标签: java algorithm compiler-construction static compiler-errors


【解决方案1】:

您不应该直接调用paint(...) 方法,因此您的错误虽然很重要,但需要理解(请参阅this link),这不是问题。你需要重组你的程序,这样你就不会觉得你有必要进行这个调用。大多数 Swing 和 AWT 应用程序通过让您更改类属性然后在渲染的组件上调用 repaint() 来执行“被动”绘图来实现最佳效果,以便建议 JVM 重新绘制它。

【讨论】:

    【解决方案2】:

    这个编译器错误意味着你试图调用一个实例方法,但你没有指定一个实例。

    您需要一个 sagum 类的实例,并在其上调用 paint() 方法,如下所示:

    sagum s = new sagum();
    ...
    s.paint(g);
    ...
    

    如果您从同一个实例中的另一个实例方法调用一个实例方法,您可以显式使用this 来指示该实例,或者您可以完全省略它并隐含this

    但是,在这种特定情况下,就像others have indicated, 一样,您不应该直接绘画。编写您的程序,以便 Swing(或 AWT 或 JavaFX)管理绘制时间表。

    【讨论】:

    • 不,请不要这样建议。这是一个 Swing 应用程序,他不应该直接调用paint 方法。他需要重新构建他的程序,以便它使用被动渲染(除非在非常罕见的情况下,他绝对需要主动渲染)。
    • 嗯,在这种情况下确实如此。我试图向他展示实例方法是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多