2011-12-06 34 views
1

編輯:分類。見底部的解決方案幻方NullPointerException。 Yay

好吧,我必須寫一個程序,它在用戶輸入直到用戶鍵入「X」,此時我的代碼應該評估三件事情:

  1. 如果數的輸入(n)是方形的
  2. 如果輸入是唯一的&包含數字1-n
  3. 如果輸入的順序產生幻方。

一切我張貼編譯,我可以「X」或在第一次輸入「(字符)」,但如果我輸入一個整數,我得到:

異常在線程「主」顯示java.lang.NullPointerException 在Square.add(Square.java:32) 在TestMagicSquare.main(TestMagicSquare.java:40)

我在做什麼錯?這是我的代碼。 (忽略和檢查方法,我還沒有割肉出來。)

功能類

/* 
    * HW 01 
    * Nick Smith 
    * 1 December 2011 
    * 
    */ 

    import java.util.*; 

    public class Square 
    { 
private ArrayList<Integer> numbers; 
private int [][] square; 
private int rowSum, colSum, TLBRSum, TRBLSum = 0; 

/* 
* Default constructor of Square class 
* 
*/ 
public Square() 
{ 

} 

//step 0 add inputs to arraylist numbers 
/* 
* 
* 
*/ 
public void add(int i) 
{ 
    numbers.add(i); 
} 

//step 1 after inputs, number of inputs are square 
/* 
* 
* 
*/ 
public boolean isSquare() 
{ 
    for(int i=0; i<50; i++) 
    { 
     if(numbers.size() == i*i) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

//step 2 after inputs, check if all unique #s are used 
/* 
* 
* 
*/ 
public boolean isUnique() 
{ 
    for(int i = 1; i<=numbers.size(); i++) 
    { 
     if(numbers.contains(i)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

//step 3 populate indices in numbers into square 

/* 
* 
* 
*/ 
public void addToSquare() 
{ 
    for(int i=0; i<square.length; i++) 
    { 
     for(int j=0; j<square[0].length; j++) 
     { 
      square[i][j] = numbers.get(i*square.length+j); 
     } 
    } 


} 

//step 4 find the magic number 

/* 
* 
* 
*/ 
public int findMagicNumber() 
{ 
    int magicNumber = 0; 

    for(int i=0; i < square.length; i++) 
    { 
     magicNumber += square[0][i]; 
    } 

    return magicNumber; 
} 

/* 
* 
* 
*/ 
public int addRows() 
{ 

    return rowSum; 
} 

/* 
* 
* 
*/ 
public int addCols() 
{ 
    return colSum; 
} 

/* 
* 
* 
*/ 
public int addTLBR() 
{ 
    return TLBRSum; 
} 

/* 
* 
* 
*/ 
public int addTRBL() 
{ 
    return TRBLSum; 
} 

//step 5, check if rows = cols = diagonals = magic number 
/* 
* 
* 
*/ 
public boolean isMagic() 
{ 
    if (addRows() == addCols() && addTLBR() == addTRBL() && addRows() == addTRBL() && addRows() == findMagicNumber()) 
    { 
     return true; 
    } 
    return false; 
} 

}

測試類

import java.util.*; 

    public class TestMagicSquare 
    { 
public static void main (String [] args) 
{ 

    //instantiate new Scanner class object 
    Scanner scan = new Scanner(System.in); 

    //instantiate new Square class object from default constructor 
    Square mySquare = new Square(); 

    //instance variables 
    boolean running = true; 
    String prompt = ". Enter a number (x to quit): "; 
    String error = "***Invalid data entry, please try again.***"; 
    int inputNum = 1; 

    //Allow user to input until "x" is typed 
    while(running) 
    { 
     System.out.print("\nInput number " + inputNum + prompt); 

     if(!scan.hasNextInt()) 
     { 
      if(scan.next().equalsIgnoreCase("x")) 
      { 
       System.out.println("Input terminated by user. Checking for square and magicness."); 
       running = false; 
      } 
      else 
      { 
       System.out.println(error); 
      } 
     } 
     else 
     { 
      inputNum++; 
      mySquare.add(scan.nextInt()); 
     } 
    } 

    //Note for Dec 6 - Compiles, but not sure if this logic is right. 

    // Test inputs against constraints defined in functional class Square 
    if(!mySquare.isSquare()) 
    { 
     System.out.println("Step 1: Number of inputs not square. Aborting program"); 
    } 
    else if(!mySquare.isUnique()) 
    { 
     System.out.println("Step 2: Numbers are not unique. Aborting program."); 
    } 
    else if(!mySquare.isMagic()) 
    { 
     System.out.println("Step 3: Square is not magic. Aborting program."); 
    } 
    else 
    { 
     System.out.println("Step 1: Number of inputs is square"); 
     System.out.println("Step 2: Numbers are unique"); 
     System.out.println("Step 3: MAGIC SQUARE! Holy crap!"); 
    } 
} 
    } 

與往常一樣,任何幫助表示讚賞。

SOLUTION:

謝謝大家。我現在都知道了。我非常感謝你的幫助。

我用

private ArrayList<Integer> numbers = new ArrayList(); 
在頂部聲明

沿着

private int [][] square; 

double dubble = Math.sqrt(numbers.size()); 
    int squareSize = (int)dubble; 

    square = new int[squareSize][squareSize]; 
在AddToSquare()方法,該方法我直接在我的while循環後稱爲

測試類。

我希望這有助於任何人在未來尋找答案。

+0

你在哪裏intialize私人的ArrayList 號碼? – jatanp

+1

「Square.add(Square.java:32)at」處的java.lang.NullPointerException。看看那條線。那裏的東西是空的。 – Thilo

+0

@jatanp - 我將它定義在頂部,但這樣還不夠嗎?我必須讓一個新的Arraylist實例化嗎? – novalsi

回答

2

我想你錯過實例化ArrayList<Integer>和陣列 - private int [][] square;

private ArrayList<Integer> numbers=new ArrayList<Integer>(); 
+0

謝謝,這似乎更好。仍然不完美,但代碼中還存在其他問題(例如我的顯然是組成的array.add)。 – novalsi

1

你從來沒有說過有一個數字列表。

private ArrayList numbers;

應該可能是

private List numbers = new ArrayList();

相關問題