首页 > 解决方案 > 处理图像加载 NullPointerException

问题描述

我正在处理一个处理项目,我正在尝试添加代码来加载和显示标志。

这是代码的样子:

在 setup() 函数内部,有这段代码用于加载图像:

PImage flag_Japan = loadImage("Flag_Japan.png");
PImage flag_None = loadImage("Flag_None.png");

在另一个文件(链接到第一个文件)中,所有函数之外都有这段代码,用于将标志图像声明为全局变量并从国家名称中获取它们:

PImage flag_Japan;
PImage flag_None;

PImage getFlag(String s) {
  switch(s) {
    case "Japan": return flag_Japan;
    default: return flag_None;
  }
}

最后,在 draw() 中调用的函数中,有这段代码可以显示它们:

println(getCountry(pe.name)); //testing, prints "Japan"
image(getFlag(getCountry(pe.name)), X_MIN+5, y+5);

数据文件夹包含以下文件:

包含多个文件的文件夹,其中一个名为

当我运行处理代码时,我在显示代码行(使用 image() 函数的代码行)上得到一个 NullPointerException。代码出了什么问题?是否有更有效的方式来加载和显示正在处理的多个国旗?

标签: processing

解决方案


您的代码setup实际上是创建两个新的局部变量并将图像加载到其中。由于它们是您的setup函数的本地变量,因此您从中返回的变量getFlag没有加载任何图像(它们指向null; 因此NullPointerException)。

为什么
当你在变量名()前面使用类型时,PImage flag_Japan = ...它表明你正在声明一个变量。通常,您不能声明两个具有相同名称的变量,但由于您在函数内部这样做是允许的。这个新变量的范围仅限于函数内部,因此它不会与其他同名的全局变量混淆。

因此,您从中访问的全局变量getFlag永远不会加载任何图像。

修复它
幸运的是,修复很简单:只要确保你只声明了一组全局变量。

在处理中,项目中任何文件的代码都可以看到所有其他文件中的代码,所以这应该可以工作:

文件 1:

// declaring global variables to be used everywhere
PImage flag_Japan;
PImage flag_None;

void setup() {
    // load images into the global variables
    // note: no PImage type here so we don't accidentally create new variables
    flag_Japan = loadImage("Flag_Japan.png");
    flag_None = loadImage("Flag_None.png");
}

文件 2:

// don't re-declare the variables here
// we can access the global ones from File 1

PImage getFlag(String s) {
  switch(s) {
    case "Japan": return flag_Japan;
    default: return flag_None;
  }
}

推荐阅读