public class InHill
{
private int[][] key={{1,1},{3,4}};//用来存储密钥 public String pNum;//明文 int[][] num=new int[2][];//用来存储明文拆成单个字符
int mod=26; //取模数
int setM=97; //设置字母对应的数字
public InHill(String str)
{
this.pNum = str;
int l=0;
for (int i = 0; i < 2; i++)
{
for(int j=0;j<pNum.length()/2;j++)
{
try
{
num[i][j] = (int) pNum.charAt(l++) - setM;
/*这里原来不加try catch编译时会抛出一个空指针异常,但现在加上了,在编译的时候可以通过,但在执行的时候会抛出
java.lang.NullPointerException
at InHill.<init>(InHill.java:20)
at InHill.main(InHill.java:59)
请问这是怎么回事?(环境变量绝对没有配错)*/
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
} //加密过程
public int[][] input()
{
int row=num.length; //行
int column=key[0].length; //列
int[][] data=new int[row][column];
if(num.length!=key[0].length)
{
System.out.println("行数于列数不相等");
return null;
}
else
{
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
data[i][j]=0;
for(int k=0;k<num[0].length;k++)
{
data[i][j]=(char)(data[i][j]+key[i][k]*num[k][j])%mod+setM;
}
}
}
}
return data;
}
public static void main(String[] args)
{
InHill ih = new InHill("abcdef");
ih.input();
}
}
public class InHill
{
private int[][] key={{1,1},{3,4}}; public String pNum; int[][] num; //=new int[2][] 你当时在这里只分配了行空间,并未分配列空间
int mod=26;
int setM=97;
public InHill(String str)
{
this.pNum = str;
int l=0;
num=new int[2][pNum.length()/2]; //这样才算是完整的分配了数组的内存
for (int i = 0; i < 2; i++)
{
for(int j=0;j<pNum.length()/2;j++)
{
num[i][j] = (int) pNum.charAt(l++) - setM;
}
}
} public int[][] input()
{
int row=num.length;
int column=key[0].length;
int[][] data=new int[row][column];
if(num.length!=key[0].length)
{
System.out.println("ÐÐÊýÓÚÁÐÊý²»ÏàµÈ");
return null;
}
else
{
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
data[i][j]=0;
for(int k=0;k<num[0].length;k++)
{
data[i][j]=(char)(data[i][j]+key[i][k]*num[k][j])%mod+setM; //但是你这里又有问题,k越界了,你初始化key数组是2行2列,但你程序中这里的k会根据明文的长度而大小不同,因为不知道你这一步的目的,所以没改
}
}
}
}
return data;
}
public static void main(String[] args)
{
InHill ih = new InHill("abcdefasda");
ih.input();
}
}
你的问题就是数组未分配内存就使用的问题,至于后面还有的那个错误我不知道你目的所以未动,是数组越界问题,你自己看怎么改.
[code=Java]
public class InHill
{
private int[][] key={{1,1},{3,4}};//用来存储密钥 public String pNum;//明文 int[][] num;//用来存储明文拆成单个字符
int mod=26; //取模数
int setM=97; //设置字母对应的数字
public InHill(String str)
{
this.pNum = str;
num=new int[2][pNum.length()/2];
int l=0;
for (int i = 0; i < 2; i++)
{
for(int j=0;j<pNum.length()/2;j++)
{
try
{
num[i][j] = (int) pNum.charAt(l++) - setM;
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
public int[][] input()
{
int row=num.length; //行
int column=key[0].length; //列
int[][] data=new int[row][column];
if(num.length!=key[0].length)
{
System.out.println("行数于列数不相等");
return null;
}
else
{
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
data[i][j]=0;
for(int k=0;k<key[0].length;k++)
{
data[i][j]+=key[i][k]*num[k][j];
System.out.println((char)(data[i][j]%mod+setM));
/*这里打印出h s i t v n y q,但是我想要的效果是s t n q,再者说,这是一个矩阵的相乘2*2出来应该还
是个2*2啊4个数~~~~怎么这里会出现8个数呢?而且都还是两个字符之间加一个字符~~~请问这是为什么?*/
}
}
}
}
return data;
}
public static void main(String[] args)
{
InHill ih = new InHill("hill");
ih.input();
}
}
[code]
char 占16bit,将int型的转化为char型的,就会出现两个字符
int c = (97%26+97);
System.out.print((char)c);输出t,java中这种强制转换是可以的打印出h s i t v n y q可能是跟循环语句有关系
就是System.out.println(data[i][j);出现的还是8个数字~~~~~到底是循环哪有问题?怎么都看不出啊~~~~