【问题标题】:How to declare a variable in a method as static (java)如何将方法中的变量声明为静态(java)
【发布时间】:2014-07-22 00:54:03
【问题描述】:

我正在创建一个使用多个类的加密/解密程序。我有一个类是 UI,并使用带有文件选择器的 JFrame 表单,以及另一个加密/解密所选文件的类。我在加密类中尝试使用 UI 类中声明的 java.io.File 变量时遇到问题。

文件选择器代码:

public static void actionEncrypt() {
    encrypt = true;
    int retVal = selectFile.showOpenDialog(null);
    if (retVal == selectFile.APPROVE_OPTION) {
        java.io.File file = selectFile.getSelectedFile();
        System.out.println(file);
        Crypt.encrypt();
    }
}

变量声明代码:

public static boolean encrypt;
public static java.io.File file;

文件读取代码:

public static void encrypt() {
    System.out.println(MainUI.file);
    try {
        Scanner filescan = new Scanner(MainUI.file);
        int count = 0;
        while (filescan.hasNextLine()) {
            count++;
            filescan.nextLine();
        }
    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
    }
}

当我运行此代码时,我得到一个NullPointerException,因为在文件读取代码运行时 File 变量的值为 null。这是因为它在变量声明代码中被声明为静态,这会覆盖在方法actionEncrypt 中声明的值。如果我不使变量静态,当我尝试从其他类访问它时,我会得到一个Cannot find symbol。但是,我不能在方法actionEncrypt 中将变量声明为静态变量,因为它给了我一个illegal start of expression。有谁知道如何在不隐藏字段的情况下将方法中的变量声明为静态变量,或者以任何其他方式在另一个类中使用 File 变量?

提前致谢,

圣地亚哥

【问题讨论】:

  • "The variable must be static in order to be accessed from other classes." -- 这是错误的,非常错误。您的变量绝对应该是静态的。我并不是说永远不应该使用静态变量,事实上在很多情况下它们非常有用,但我说这不是其中一种情况。相反,如果它必须可以从其他类访问,请将其设为实例变量,并考虑为此类提供 getter 方法。
  • 向我们展示更多代码,我们将向您展示如何重新排列它,这样您就不需要使用static 变量,或者确保首先进行初始化。跨度>
  • @Hovercraft Full Of Eels - 抱歉,我没说对。我的意思是,在这些特定情况下,变量必须是静态的,否则我在尝试从加密类访问它时会得到一个Cannot find symbol。我用更准确的措辞编辑了这个问题。
  • 听起来你正在使用 MainUI 类而不实例化它。在这种情况下,您应该在 MainUI 中有一些代码在加密代码调用它之前初始化变量 file
  • 如何初始化变量file?设置为选中的文件时不是已经初始化了吗?

标签: java nullpointerexception static-methods static-variables


【解决方案1】:

我想我在您的代码中看到了错误。

更改以下行,以便您初始化 MainUI.file。目前,您正在创建一个名为 file 的局部变量并初始化该变量,而不是您可能打算初始化的 MainUI.file

    java.io.File file = selectFile.getSelectedFile();

替换为。

    MainUI.file = selectFile.getSelectedFile();

【讨论】:

  • 所以我假设我将替换代码添加到加密类中?
  • @Santiago,删除第一行,将第二行放在原来第一行的位置。
  • 好的。我尝试将它放在任何一个类中,并且在两个类中都有效。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多