getGraphics()抛空指针异常

时间:2023-02-05 10:21:38
Image tempBufferedImage = this.createImage(this.getWidth(), this.getWidth());
Graphics2D g2d=null;
try {
g2d = (Graphics2D) tempBufferedImage.getGraphics();   //①
//g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e) {
System.out.println("116");
}

①处总是抛出空指针异常,也就是总是走catch,怎么能解决这个问题。

10 个解决方案

#1


此类继承JPanel

#2


你检查一下看看tempBufferedImage这个引用是不是空的

#3


这个getGraphics方法返回的是个空值。jdk提供的方法,但是。。。

#4


 g2d = tempBufferedImage.createGraphics();   

改成这样试试

#5


由于没有完整的代码,自己补充了部分代码。

运行后,并没有抛出异常,请楼主给出完整代码。

我的代码如下:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JPanel;

public class ImageDemo1 extends JPanel
{
public void createImg()
{
Image tempBufferedImage = this.createImage(this.getWidth(),
this.getWidth());
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}

#6


sorry,搞错了。另外,
在eclipse中运行时,会出现null并不奇怪。

(1)参考JPanel中的createImage()方法的说明:如果组件不可显示,则该方法返回null

(2)在楼主的代码中,自定义JPanel类并不能单独显示,因为JPanel只是一个容器组件,而Java的组件显示是要在窗体中才能显示,必须把JPpanel加入到窗体中去后,调用窗体的setVisible(true)才能显示。

根据以上两点,可有结论:
    因为自定义的JPanel类并不在任一个窗体中,如JFrame,所以它并不能显示出来。
    导致的结果是:
        通过自定义的JPanel类组件调用createImage()方法,得到的只是null

以下是在自定义的JFrame中使用createImage()方法,并没有出现异常。因为JFame可以独立显示出来。

代码:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JFrame;

public class ImageDemo1 extends JFrame
{
private int width = 200;
private int height = 200;

public ImageDemo1()
{
setTitle("ImageDemo1");
setSize(300, 300);
setVisible(true);

setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public Image createImg()
{
Image tempBufferedImage = this.createImage(this.width,
this.height);
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}

return tempBufferedImage;
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}

#7


补充:

(1)JPanel通过继承Component类,从而拥有createImage()方法

(2)添加的代码并不影响楼主的意图
    createImage()方法中的参数并没有使用getWidth()方法,而是直接使用自定义的属性width和height,也可以在其中增加方法getWidth()和getHeight(),来获取width和height属性
    

#8


getGraphics
public abstract Graphics getGraphics()创建供绘制闭屏图像(off-screen image)使用的图形上下文。 此方法仅供闭屏图像调用。 

返回:
绘制闭屏图像的图形上下文。   

你那个Image对象是闭屏图像吗?



#9


引用 4 楼 huntor 的回复:
 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档

#10


引用 9 楼 wuyanxue 的回复:
Quote: 引用 4 楼 huntor 的回复:

 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档

被变量名迷惑了,以为是个BufferedImage。

#1


此类继承JPanel

#2


你检查一下看看tempBufferedImage这个引用是不是空的

#3


这个getGraphics方法返回的是个空值。jdk提供的方法,但是。。。

#4


 g2d = tempBufferedImage.createGraphics();   

改成这样试试

#5


由于没有完整的代码,自己补充了部分代码。

运行后,并没有抛出异常,请楼主给出完整代码。

我的代码如下:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JPanel;

public class ImageDemo1 extends JPanel
{
public void createImg()
{
Image tempBufferedImage = this.createImage(this.getWidth(),
this.getWidth());
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}

#6


sorry,搞错了。另外,
在eclipse中运行时,会出现null并不奇怪。

(1)参考JPanel中的createImage()方法的说明:如果组件不可显示,则该方法返回null

(2)在楼主的代码中,自定义JPanel类并不能单独显示,因为JPanel只是一个容器组件,而Java的组件显示是要在窗体中才能显示,必须把JPpanel加入到窗体中去后,调用窗体的setVisible(true)才能显示。

根据以上两点,可有结论:
    因为自定义的JPanel类并不在任一个窗体中,如JFrame,所以它并不能显示出来。
    导致的结果是:
        通过自定义的JPanel类组件调用createImage()方法,得到的只是null

以下是在自定义的JFrame中使用createImage()方法,并没有出现异常。因为JFame可以独立显示出来。

代码:
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JFrame;

public class ImageDemo1 extends JFrame
{
private int width = 200;
private int height = 200;

public ImageDemo1()
{
setTitle("ImageDemo1");
setSize(300, 300);
setVisible(true);

setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public Image createImg()
{
Image tempBufferedImage = this.createImage(this.width,
this.height);
Graphics2D g2d = null;
try
{
g2d = (Graphics2D) tempBufferedImage.getGraphics(); // ①
// g2d = (Graphics2D)getGraphics();
} catch (NullPointerException e)
{
System.out.println("116");
}

return tempBufferedImage;
}

/**
 * @param args
 */
public static void main(String[] args)
{
ImageDemo1 id1 = new ImageDemo1();
id1.createImg();
}

}

#7


补充:

(1)JPanel通过继承Component类,从而拥有createImage()方法

(2)添加的代码并不影响楼主的意图
    createImage()方法中的参数并没有使用getWidth()方法,而是直接使用自定义的属性width和height,也可以在其中增加方法getWidth()和getHeight(),来获取width和height属性
    

#8


getGraphics
public abstract Graphics getGraphics()创建供绘制闭屏图像(off-screen image)使用的图形上下文。 此方法仅供闭屏图像调用。 

返回:
绘制闭屏图像的图形上下文。   

你那个Image对象是闭屏图像吗?



#9


引用 4 楼 huntor 的回复:
 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档

#10


引用 9 楼 wuyanxue 的回复:
Quote: 引用 4 楼 huntor 的回复:

 g2d = tempBufferedImage.createGraphics();   

改成这样试试


Image对象貌似不能用createGraphics();方法 我查了API文档

被变量名迷惑了,以为是个BufferedImage。