main.java
package matrix;
import java.util.*;
/**
 *
 * @author Administrator
 */
public class Main {    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        System.out.println("Input a number");
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int N = n*n;
        changeDir maxtir =new changeDir();
        maxtir.setNumber(N);
        maxtir.setArray(n);
        for(int i=n;i>=0;i=i-2)
        {
            maxtir.LTR(i);
            maxtir.UTD(i);
            maxtir.RTL(i);
            maxtir.DTU(i);
            maxtir.add();
        }
        maxtir.print(n);
    }
}
changeDir.java:
package matrix;/**
 *
 * @author Administrator
 */
public class changeDir {
    private int i,j;//显示时候的坐标x,y
    private int array[][];//显示的数组
    private int number[];//一共的数字
    private int count=0;
    public void add()
    {
        count++;
    }
    public void setNumber(int N)
    {
        for(int k=0;k<N;k++)
        {
            number[k] = k+1;
        }
    }
    public void setArray(int n)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                array[i][j]=0;
            }
        }
    }    public void LTR(int n)//n是输入数值的大小
    {
        i=count;
        for(j=count;j<n;j++)
        {
            array[i][j]=number[j];
        }
    }
    public void UTD(int n)
    {
        j=n-1-count;
        for(i=count;i<n;i++)
        {
            array[i][j]=number[i+j];
        }
    }
    public void RTL(int n)
    {
        i = n-1-count;
        int c=0;
        for(j=n-1-count;j>=0;j--)
        {
            array[i][j] = number[i*2+c];
            
        }
    }
    public void DTU(int n)
    {
       j=count;
       int c=0;
       for(i=n-1-count;i>=0;i--)
       {
           array[i][j]=number[i*3+c];
       }
    }
    public void print(int n)
    {
        for(i=0;i<n;i++)
        {
            for (j = 0; j < n; j++)
            {
                System.out.printf("%2d", array[i][j]);
            }
            System.out.println();
        }
    }
}

解决方案 »

  1.   

    数组没有初始化,  所以发生空指针异常
    改了两个地方
    public void setNumber(int N){
    number=new int[N]; public void setArray(int n){
    array=new int[n][n];
    public class changeDir{
    private int i,j;// 显示时候的坐标x,y
    private int array[][];// 显示的数组
    private int number[];// 一共的数字
    private int count=0; public void add(){
    count++;
    } public void setNumber(int N){
    number=new int[N];
    for(int k=0;k < N;k++){
    number[k]=k + 1;
    }
    } public void setArray(int n){
    array=new int[n][n];
    for(i=0;i < n;i++){
    for(j=0;j < n;j++){
    array[i][j]=0;
    }
    }
    } public void LTR(int n)// n是输入数值的大小
    {
    i=count;
    for(j=count;j < n;j++){
    array[i][j]=number[j];
    }
    } public void UTD(int n){
    j=n - 1 - count;
    for(i=count;i < n;i++){
    array[i][j]=number[i + j];
    }
    } public void RTL(int n){
    i=n - 1 - count;
    int c=0;
    for(j=n - 1 - count;j >= 0;j--){
    array[i][j]=number[i * 2 + c]; }
    } public void DTU(int n){
    j=count;
    int c=0;
    for(i=n - 1 - count;i >= 0;i--){
    array[i][j]=number[i * 3 + c];
    }
    } public void print(int n){
    for(i=0;i < n;i++){
    for(j=0;j < n;j++){
    System.out.printf("%2d",array[i][j]);
    }
    System.out.println();
    }
    }
    }