編輯:分類。見底部的解決方案幻方NullPointerException。 Yay
好吧,我必須寫一個程序,它在用戶輸入直到用戶鍵入「X」,此時我的代碼應該評估三件事情:
- 如果數的輸入(n)是方形的
- 如果輸入是唯一的&包含數字1-n
- 如果輸入的順序產生幻方。
一切我張貼編譯,我可以「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循環後稱爲
測試類。
我希望這有助於任何人在未來尋找答案。
你在哪裏intialize私人的ArrayList號碼? –
jatanp
「Square.add(Square.java:32)at」處的java.lang.NullPointerException。看看那條線。那裏的東西是空的。 – Thilo
@jatanp - 我將它定義在頂部,但這樣還不夠嗎?我必須讓一個新的Arraylist實例化嗎? – novalsi