我正在开发一个 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) {
[...]
}
我尝试了几种为函数赋值的方法:
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);
}
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 { ... }
是您的实际代码所在的位置。