【问题标题】:Processing image loading NullPointerException处理图像加载 NullPointerException
【发布时间】:2021-08-05 11:50:50
【问题描述】:

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

这就是代码的样子:

在 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


    【解决方案1】:

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

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

    因此,您从 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;
      }
    }
    

    【讨论】:

    • @Julio974 这是variable shadowing (+1) 的一个很好的观点。
    • 非常感谢!是的,只需在设置中删除“PImage”即可避免重新声明新变量,现在完全可以使用!
    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多