Java 设置椭圆投掷错误

Java 设置椭圆投掷错误,java,swing,graphics,nullpointerexception,Java,Swing,Graphics,Nullpointerexception,我目前正在处理一个项目,我得到了这个错误Java.lang.NullPointerException,我不知道当你试图引用一个空对象实例时会发生这个错误,但我不知道如何修复它 这是我的代码: public void paint(Graphics g) { g.setColor(Color.red); g.drawOval(150, 150, 10, 10); } /** Main Method **/ public static void main(String [] args

我目前正在处理一个项目,我得到了这个错误
Java.lang.NullPointerException
,我不知道当你试图引用一个空对象实例时会发生这个错误,但我不知道如何修复它

这是我的代码:

public void paint(Graphics g) {
    g.setColor(Color.red);
    g.drawOval(150, 150, 10, 10);
}

/** Main Method **/
public static void main(String [] args) {
    Run run = new Run();
    run.paint(null);
}

请帮我找到一个解决方案,并解释一下,以便我学习。非常感谢。安德烈

你做得不对。为了在java中使用图形,您需要构建Swing/AWT组件。当前,您正在以null形式传递图形

run.paint(null);

您需要使用JFrame和其他swing组件来实现这一点。

因为您要将
null
发送到
paint
图形g
包含
null
(指向任何地方)


然后在
paint(…)
内部调用
g
上的
setColor(…)
,即
null
null.setColor(…)
导致
NullPointerException

您不能将null传递给绘制方法!下面是一个小示例,说明如何执行此操作:

import java.awt.Graphics;

import javax.swing.JComponent;
import javax.swing.JFrame;

class MyCanvas extends JComponent {

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval (10, 10, 200, 200);  
    }
}

public class DrawOval {
    public static void main(String[] a) {
        JFrame window = new JFrame();
        window.setBounds(30, 30, 300, 300);
        window.getContentPane().add(new MyCanvas());
        window.setVisible(true);
    }
}
  • 您几乎从不直接调用
    paint
    方法(包括
    paintComponent
    ),因为这是JVM应该做的事情
  • 如果可以避免,请不要重写JComponent或JComponent派生类(如JPanel)的
    paint(Graphics g)
    方法。此方法“绘制”不仅负责绘制零部件,还负责绘制零部件的边框及其子零部件,如果不小心执行,重写此方法通常会导致不必要的副作用
  • 稍后,当您想要制作图形动画时,覆盖
    paint(graphics g)
    将导致图形抖动,因为默认情况下它不会进行双缓冲
  • 通过替代
    paintComponent(Graphics g)
    方法,您可以解决这些问题
  • 不要忘了在覆盖中调用super的
    paintComponent(g)
    方法来删除任何不需要的先前绘制的图像
  • 阅读Swing图形教程,包括基本教程和高级教程。链接在底部

  • 更好的代码:

    import java.awt.Dimension;
    import java.awt.Graphics;
    
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyBetterCanvas extends JComponent {
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          g.drawOval(10, 10, 200, 200);
       }
    
    
       public static void main(String[] a) {
          MyBetterCanvas canvas = new MyBetterCanvas();
          canvas.setPreferredSize(new Dimension(300, 300));
          JFrame window = new JFrame("My Better Canvas");
          window.getContentPane().add(canvas);      
          window.setLocationByPlatform(true);
          window.pack();
          window.setVisible(true);
       }
    }
    

    更好的是:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Paint;
    import java.awt.RenderingHints;
    
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    
    @SuppressWarnings("serial")
    public class MyBetterStillCanvas extends JComponent {
       private static final int PREF_W = 500;
       private static final int PREF_H = 500;
       private static final int OVAL_X = 10;
       private static final int OVAL_Y = OVAL_X;
       private static final Paint BG_PAINT = new GradientPaint(0, 20,
             Color.black, 20, 0, Color.darkGray, true);
    
       private static final Paint FILL_PAINT = new GradientPaint(0, 0,
             Color.blue, 20, 20, Color.red, true);
    
       @Override
       protected void paintComponent(Graphics g) {
          super.paintComponent(g);
          Graphics2D g2 = (Graphics2D) g;
          // to smooth out graphics
          g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
          // let's draw something funky
    
          g2.setPaint(BG_PAINT);
          g2.fillRect(0, 0, getWidth(), getHeight());
    
          g2.setPaint(FILL_PAINT);
          // avoid use of "magic" numbers
          g.fillOval(OVAL_X, OVAL_Y, getWidth() - 2 * OVAL_X, getHeight() - 2
                * OVAL_Y);
       }
    
       // a cleaner way to set the preferred size of a component
       @Override
       public Dimension getPreferredSize() {
          return new Dimension(PREF_W, PREF_H);
       }
    
       public static void main(String[] a) {
          JFrame window = new JFrame("My Better Canvas");
          window.getContentPane().add(new MyBetterStillCanvas());
          window.setLocationByPlatform(true);
          window.pack();
          window.setVisible(true);
       }
    }
    
    显示为:


    教程:

    • 基本Swing图形教程:
    • 更多高级图形文章:

    您是否在此处传递空值<代码>run.paint(空)?好吧,如果你知道,那么你到底为什么要传递
    null
    ?然后提供完整的代码,这样我们就可以锁定答案(并在键入时使用“@”通知他人-请参阅
    帮助
    )。只需删除这一行:
    run.paint(null)。如果需要,您应该使用
    repaint()
    方法调用它:
    run.repaint()
    。通常您不会调用AWT线程调用的
    paint()
    。你想要实现什么?哇,非常感谢你,你的帮助,我想我将从0开始,这样我就真的不需要重新开始,我正在做什么,我将阅读所有java教程,我很年轻,所以我还有很长的未来,再次感谢你