Java 扩展画布时绘制方法出错';s级

Java 扩展画布时绘制方法出错';s级,java,swing,canvas,nullpointerexception,desktop,Java,Swing,Canvas,Nullpointerexception,Desktop,谁能帮帮我吗?我已经做到了 线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 at Frame.Painter.paint(Main.java:399)at paintComponent(repaintrea.java:264)位于 paint(RepaintArea.java:240)位于 sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:358)位于 di

谁能帮帮我吗?我已经做到了

线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常 at Frame.Painter.paint(Main.java:399)at paintComponent(repaintrea.java:264)位于 paint(RepaintArea.java:240)位于 sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:358)位于 dispatchEventImpl(Component.java:4965)位于 dispatchEvent(Component.java:4711)位于 dispatchEventImpl(EventQueue.java:758)位于 访问$500(EventQueue.java:97) java.awt.EventQueue$3.run(EventQueue.java:709)在 java.awt.EventQueue$3.run(EventQueue.java:703)在 java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 在 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86) 在java.awt.EventQueue$4.run(EventQueue.java:731)处 java.awt.EventQueue$4.run(EventQueue.java:729)在 java.security.AccessController.doPrivileged(本机方法)位于 ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76) 位于java.awt.EventQueue.dispatchEvent(EventQueue.java:728) java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 在 java.awt.EventDispatchThread.PumpeEventsforFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.PumpeEventsforHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

第399行的代码为:

class Painter extends Canvas{
    Image image;
    private URL url;
    public void setImage(String file) {
        url = null;
        try {
            url = new File(file).toURI().toURL();
        } catch (MalformedURLException ex) {
            System.out.println(ex.toString());
        }
        image = getToolkit().getImage(url);
        repaint();
    }
    public void paint(Graphics g) {
        double d = image.getHeight(this) / this.getHeight();
        double w = image.getWidth(this) / d;
        double x = this.getWidth() / 2 - w / 2;
        g.drawImage(image, (int) x, 0, (int) (w), this.getHeight(), this);
    }
}

我不知道那里到底发生了什么事。我的程序运行正常,但每次运行时都会因为这个错误而感到不安。请告诉我该怎么做。

我假设您有以下代码:

class Painter extends Canvas{
    Image image;
    private URL url;
    public void setImage(String file) {
        image = Toolkit.getDefaultToolkit().getImage(file);
        repaint();
    }
    public void paint(Graphics g) {
      if(image!=null) {
        double d = image.getHeight(this) / this.getHeight();
        double w = image.getWidth(this) / d;
        double x = this.getWidth() / 2 - w / 2;
        g.drawImage(image, (int) x, 0, (int) (w), this.getHeight(), this);
      }
    }
}

然后只需调用setImage(“c:/yourfilepath/yourfilename”)

1)请参见&2)使用逻辑一致的代码行和代码块缩进形式。缩进的目的是使代码流更易于遵循。。。。3) 应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。4) 为了更快地获得更好的帮助,请发布or。继续@AndrewThompson的列表:5)不要重写
paint()
方法,而是使用
paintComponent()
,不要忘记调用
super.paintComponent()
作为其中的第一条语句,并使用
@override
注释。6) 不要将
Canvas
等AWT组件与Swing组件混合使用,请改用
JPanel
。7) 你的NPE很可能是因为找不到图像,按照上面提供的嵌入式资源链接,试着打印它的值,或者用断点调试你的代码,看看它是否为空。除了GUI,你在其他任何地方都找不到这种人——这是一种特殊的nutso“然后你只需要调用setImage(”c:/yourfilepath/yourfilename”)“除了缺少对URL的转换之外,这实际上并没有给解决方案增加任何内容。如果路径在问题中显示的代码中是正确的,那么它就可以工作了。这也无法修复@Frakcool建议第5点中提到的破损油漆链。总而言之,这只不过是噪音,并没有比在评论中表达的更好。“除了没有转换成URL”:除非你继续堆积你自己的crap@AndrewThompson除非在
setImage
@MadProgrammer.Good.之前调用了
paint
。简而言之,我们不能确定。@AndrewThompson同意,这都是“猜测”的工作;)