我目前正在开发一个项目,我收到此错误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);
}
请帮助我解决方案并解释它,以便我学习它。提前谢谢了。安德烈
答案 0 :(得分:5)
您不能将null传递给paint方法!这是一个如何做的小例子:
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);
}
}
答案 1 :(得分:2)
你没有以正确的方式做到这一点。要在java中使用图形,您需要构建Swing / AWT组件。目前,您将Graphics传递为null。
run.paint(null);
您需要使用JFrame和其他swing组件来实现它。
答案 2 :(得分:2)
由于您要向null
发送paint
,Graphics g
包含null
(指向无处)。
然后在paint(...)
内,您在setColor(...)
上致电g
,即null
。 null.setColor(...)
导致NullPointerException
。
答案 3 :(得分:2)
paint
方法(包括paintComponent
),因为这是JVM应该做的事情。 paint(Graphics g)
方法。这个方法paint不仅负责绘制组件,还负责绘制组件的边框及其子组件,如果不小心,覆盖此方法不会偶尔产生不必要的副作用。paint(Graphics g)
将导致生涩的图形,因为默认情况下不会进行双重缓冲。paintComponent(Graphics g)
方法,您可以解决这些问题。paintComponent(g)
方法来删除任何不需要的以前绘制的图像。更好的代码:
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);
}
}
显示为:
教程: