如何修复使用文本文件的程序的空指针异常错误? [重复]

问题描述 投票:0回答:1

我正在开发一个 Java 解密项目,该项目涉及从文本文件中读取字符串并将它们分成对。这些字符串包含字母和整数的混合,由于项目的规范,这些字符串无法彼此分开。

当我尝试运行该程序时,出现 java.lang.NullPointerException 错误,解释如下: 无法调用“String.substring(int, int)”,因为“project.Program.plainText[i]”为空。有谁知道解决办法吗?

这是导致错误的函数:

private static void dividePairs(int i) {
        L0 = (int) Long.parseLong(plainText[i].substring(0,8), 16);
        L4 = (int) Long.parseLong(cipherText[i].substring(0,8), 16);
        R0 = (int) Long.parseLong(plainText[i].substring(8), 16);
        R4 = (int) Long.parseLong(cipherText[i].substring(8), 16);
}

本块之前的相关函数:

private static int pairs = 200;
private static int L0, L4, R0, R4;

private static String cipherText[] = new String[pairs];
private static String plainText[] = new String[pairs];

private static void readTextPairs() {
    try {
            BufferedReader br = new BufferedReader(new FileReader("known.txt"));
            boolean isPlaintext = true;
            int count = 0;
            String text = br.readLine();
            
            while(text != null && count < plainText.length) {
                if(text.length() != 0) {
                    if(isPlaintext) {
                        plainText[count] = text.substring(12);
                    }
                    else {
                        cipherText[count] = text.substring(12);
                        count++;
                    }
                    isPlaintext = !isPlaintext;
                }
                text = br.readLine();
            }
            br.close();
        }
        
        catch (FileNotFoundException e) {
            [...]
        }
        catch (IOException e) {
            [...]
        }
    }


private static void dividePairs(int i) {
        [...]
}

我尝试了几种为函数赋值的方法:

  1. 将数值赋给 int i。我使用 int 对,然后手动分配一个单独的数字。都没有修复错误。
  2. 使用 .split() 和 .parseInt() 作为解析器函数。也抛出类似的错误。
  3. 使用for循环如下(运行时抛出相同的异常错误):
for(int i = 0; i < plainText.length; i++)
        {
            L0 = (int) Long.parseLong(plainText[i].substring(0,8), 16);
            R0 = (int) Long.parseLong(plainText[i].substring(8), 16);
        }
        for(int i = 0; i < cipherText.length; i++)
        {
            L4 = (int) Long.parseLong(cipherText[i].substring(0,8), 16);
            R4 = (int) Long.parseLong(cipherText[i].substring(8), 16);
        }
java parsing exception nullpointerexception
1个回答
0
投票

cipherText[i]
是空值,而不是字符串。请注意,
new String[4]
使用 room 创建一个包含 4 个字符串的数组,但它以 4 个空指针开始。

在您的代码中,对于任何给定的 i 仅设置

cipherText[i]
plainText[i]
,这意味着调用
cipherText[i]
plainText[i]
的代码将始终失败。

你必须决定你的代码应该做什么——垃圾输入/垃圾输出。您无法编写代码来为每个

i
仅设置密文/明文之一,然后在处理时需要两者都包含内容。

想必,您的dividePairs方法应该类似于:

private static void dividePairs(int i) {
  if (plainText[i] != null) {
        L0 = (int) Long.parseLong(plainText[i].substring(0,8), 16);
        R0 = (int) Long.parseLong(plainText[i].substring(8), 16);
  } else {
        L4 = (int) Long.parseLong(cipherText[i].substring(0,8), 16);
        R4 = (int) Long.parseLong(cipherText[i].substring(8), 16);
  }
}

但我不确定这是你的意图。拥有修改静态状态的

static
方法是一个大红色警告标志 - 它强烈表明您没有正确意识到
static
的用途;常见的错误,没什么大不了的,无论如何,这更像是第二年的java事情。但是,然后,摆脱所有
static
。不允许你有任何静电。除了
main
之外,所以 main 中唯一的一行代码应该是:

new MainClass().go();

其中

void go() throws Exception { ... }
是您的实际代码所在的位置。

© www.soinside.com 2019 - 2024. All rights reserved.