处理图片加载 NullPointerException

Processing image loading 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。代码出了什么问题?在处理中有没有更高效的加载和显示多个国旗的方式?

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

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

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

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

在 Processing 中,项目中任何文件中的代码都可以看到所有其他文件中的代码,因此这应该有效:

文件 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;
  }
}