我尝试使用Java创建word encrypted和decrypter。在初始化了字母表的char数组之后,我试图通过复制到另一个Character类数组来进行洗牌(并创建crypt代码),以便进行Collections.shuffle。我没有收到任何编译错误,但在尝试运行代码时会收到NullPointerException。如果您对我的问题有任何见解,请告诉我:
我的密码学构造函数来改变字母表:
public class Cryptogram {
private char [] alphabet = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u','v', 'w', 'x', 'y', 'z' };
private char [] cryptCode;
public Cryptogram( ) {
cryptCode = new char[alphabet.length];
Character[] anAlphabet = new Character[alphabet.length];
for (int i = 0; i < alphabet.length; i++) {
alphabet[i] = anAlphabet[i];
}
List<Character> cryptList = Arrays.asList(anAlphabet);
Collections.shuffle(cryptList);
Object ob[] = cryptList.toArray();
for (int j = 0; j < anAlphabet.length; j++){
cryptCode[j] = anAlphabet[j];
}
}
我的用户输入类:
import java.util.Scanner;
public class CryptogramClient {
public static void main( String [] args ) {
Cryptogram cg = new Cryptogram( );
System.out.println( cg ); // print alphabet and substitution code
}
}
例外:
java.lang.NullPointerException
at Cryptogram.<init>(Cryptogram.java:39)
at CryptogramClient.main(CryptogramClient.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
答案 0 :(得分:4)
问题出在这里。
Character[] anAlphabet = new Character[alphabet.length];
for (int i = 0; i < alphabet.length; i++) {
alphabet[i] = anAlphabet[i];
}
它会创建一个Character
数组,但所有值都会初始化为null
(Object
的默认值)。
执行alphabet[i] = anAlphabet[i];
时,会将Character
对象取消装箱以获取其字符值。
所以基本上和这个
一样alphabet[i] = anAlphabet[i].charValue();
由于数组中的所有值都是null
,因此您获得了NPE。
查看您的代码我认为您应该交换您的任务:
anAlphabet[i] = alphabet[i];
如果要获取特定的字符串表示,也不要忘记覆盖类中的toString
方法。