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();
    }
}

解决方案 »

  1.   


    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();
        }
    }
    你的问题就是数组未分配内存就使用的问题,至于后面还有的那个错误我不知道你目的所以未动,是数组越界问题,你自己看怎么改.
      

  2.   

    非常谢谢~~~~~~~这个问题我已经搞定了!!!再请教一个~~~~这个估计是基础问题!
    [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]
      

  3.   

    因为int 占32bit
    char 占16bit,将int型的转化为char型的,就会出现两个字符
      

  4.   

    更正, 
     int c  = (97%26+97);
     System.out.print((char)c);输出t,java中这种强制转换是可以的打印出h s i t v n y q可能是跟循环语句有关系
      

  5.   

    不对啊~~~~~~
    就是System.out.println(data[i][j);出现的还是8个数字~~~~~到底是循环哪有问题?怎么都看不出啊~~~~