我试图获取图像并将其转换为在 GridLayout 中布局的图 block ,但收到运行时错误。
这是代码:
public class TileList extends JPanel {
private static final int width = 16; //width of a tile
private static final int height = width;
private int col = 1;
private int row = 1;
private BufferedImage image;
File tilesetImage = new File("image.png");
BufferedImage tileset[];
public void loadAndSplitImage (File loadImage) {
try{
image = ImageIO.read(loadImage);
}catch(Exception error) {
System.out.println("Error: cannot read tileset image.");
}// end try/catch
col = image.getWidth()/width;
row = image.getHeight()/height;
BufferedImage tileset[] = new BufferedImage[col*row];
}// end loadAndSplitImage
public TileList() {
loadAndSplitImage(tilesetImage);
setLayout(new GridLayout(row,col,1,1));
setBackground(Color.black);
int x=0;
int y=0;
for (int i = 0; i < (col*row); i++) {
JPanel panel = new JPanel();
tileset[i] = new BufferedImage(width, height, image.getType()); //first error
tileset[i] = image.getSubimage(x,y,x+width,y+height);
panel.add(new JLabel(new ImageIcon(tileset[i])));
add(panel);
x+=width;
y+=height;
}// end for loop
}// end constructor
public static void createAndShowGui() {
JFrame frame = new JFrame("TileList");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new TileList()); //second error
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}//end createAndShowGui
public static void main (String [] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run () {
createAndShowGui(); //third error
}// end run
});// end invokeLater
}// end main
}// end class
这是我收到的错误:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at TileList.<init>(TileList.java:55)
at TileList.createAndShowGui(TileList.java:73)
at TileList$1.run(TileList.java:82)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDo
main.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThre
ad.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.
java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
这个错误是什么意思?我是如何编写错误的代码的?
编辑:我按照气垫船的建议更改了代码,但是现在我有新的错误:
tileset[] = new BufferedImage[col*row];
^ error: not a statement
tileset[] = new BufferedImage[col*row];
^ error: ';' expected
tileset[] = new BufferedImage[col*row];
^ error: not a statement
最佳答案
你的错误是你正在隐藏一个变量——当它已经在类中声明时,你在构造函数中重新声明了变量tileSet。因此,类中声明的tileSet变量永远不会被初始化,因为只有局部变量(构造函数中声明的变量)被初始化。
解决方案:在类中仅声明一次tileSet。
因此,不要这样做:
public class TileList extends JPanel {
//.... deleted for brevity
BufferedImage tileset[];
public void loadAndSplitImage (File loadImage) {
try{
image = ImageIO.read(loadImage);
}catch(Exception error) {
System.out.println("Error: cannot read tileset image.");
}// end try/catch
col = image.getWidth()/width;
row = image.getHeight()/height;
BufferedImage tileset[] = new BufferedImage[col*row]; // *** re-declaring variable!
}
而是这样做:
public class TileList extends JPanel {
//.... deleted for brevity
BufferedImage tileset[];
public void loadAndSplitImage (File loadImage) {
try{
image = ImageIO.read(loadImage);
}catch(Exception error) {
System.out.println("Error: cannot read tileset image.");
}// end try/catch
col = image.getWidth()/width;
row = image.getHeight()/height;
// ************
// BufferedImage tileset[] = new BufferedImage[col*row]; // *****
tileset[] = new BufferedImage[col*row]; // **** note the difference? ****
}
请注意,比解决这个孤立问题更重要的是了解如何解决 NPE (NullPointerExceptions)。关键是检查抛出异常的行上的所有变量,检查哪些变量为空,然后在尝试使用它之前回头看看其中一个变量是否未正确初始化。
关于java - BufferedImage 数组的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178680/