Quantcast
Channel: Programming Forums
Viewing all articles
Browse latest Browse all 51036

Nullpointerexception for object Array

$
0
0
I'm writing an inventory program for my Java class and I need some help. I've built an array of Item objects but when I try to reference the Item methods from that array, it gives me a nullpointerexception.

Here is the Inventory Class
import java.io.*;
import java.awt.*;
import java.util.*;

public class Inventory {
	//TODO:  Declare variables

	private String[] text, values;
//	public static Item[] products, search;
	private int itemNumber = 0;
	public static Item[] products = null;
	public static Item[] search = null;
	
	
	

	/**
	 * Read in data from input file and build an Inventory object.
	 * 
	 * Reads the inventory data file and builds some sort of a collection of Items,
	 * one for each Item in the inventory data file. Keep in mind that addItem
	 * will want to later add an Item to the collection whose expansion must either
	 * be anticipated here or addressed in addItem.  This constructor should handle
	 * malformed inventory records containing missing, extraneous or invalid data.
	 * 
	 * @param input
	 *            Scanner object bound to the inventory data file
	 */
	public Inventory(Scanner input) throws IOException {
		// TODO: Complete the constructor, arranging for it to read the input
		// file into some sort of a collection of Items.
//		products = null;
		
		while (input.hasNext())
		{
			products = new Item[itemNumber + 1];
			products[itemNumber] = readItem(input, itemNumber);
			
			itemNumber++;
		}
		
	}

	/**
	 * @return An integer that denotes the number of items in the database.
	 */
	public int getDatabaseSize() {
		int size = products.length;
		return size;
	}

	/**
	 * Returns a reference to an Item[] containing the inventory of Items
	 * 
	 * @return A reference to an Item array that contains the inventory.
	 */
	public Item[] getCompleteDatabase() {
		// TODO: Return a reference to an Item[] containing the inventory.
		return products;
	}

	/**
	 * Search the database for Items matching the given name and color.
	 * 
	 * @param name
	 *            A String that represents the item name.
	 * @param color
	 *            The specified Color to be found
	 * @return An Item[] of matching Items or null if none.
	 */
	public Item[] searchByNameAndColor(String name, Color color) {
		// TODO
//		search = null;
		Item[] temps = products.clone();
		
		for (int i = 0; i < temps.length; i++)
		{
			Item it1 = temps[i];
			System.out.println(temps.length);
			String tempName = products[i].getName();
			System.out.println(tempName);
			Color tempColor = it1.getColor();
			if (tempName.equalsIgnoreCase(name) && tempColor == color){
				System.out.println("am i getting this far?");
				search = new Item[i+1];
				search[i] = temps[i];
			}
		}
		
		
		return search;
	}

	/**
	 * Search the database for Items matching the given name.
	 * 
	 * @param name
	 *            A String that represents the item name.
	 * 
	 * @return An Item[] of matching Items or null if none.
	 */
	public Item[] searchByName(String name) {
		// TODO
		
		for (int i = 0; i < products.length; i++)
		{
			String tempName = products[i].getName();
			if (tempName.equalsIgnoreCase(name)){
				search[i] = products[i];
			}
		}
	
		return search;
}

	/**
	 * Search the database for Items matching the given color name.
	 * 
	 * @param name
	 *            A String representing the color name (e.g. red)
	 * @return An Item[] of matching Items or null if none.
	 */
	public Item[] searchByColor(Color colorName) {
		// TODO
		for (int i = 0; i < products.length; i++)
		{
			Color tempColor = products[i].getColor();
			if (tempColor == colorName){
				search[i] = products[i];
			}
		}
	
		return search;
	}

	/**
	 * Search the database for Items matching the given price. Prices are
	 * matched to within one cent.
	 * 
	 * @param name
	 *            A double that represents the price.
	 * @return An Item[] of matching Items or null if none.
	 */
	public Item[] searchByPrice(double price) {

		// TODO

		for (int i = 0; i < products.length; i++)
		{
			Double tempPrice = products[i].getPrice();
			if (tempPrice == price){
				search[i] = products[i];
			}
		}
	
		return search;
	}

	/**
	 * Reads one line from an inventory data file containing the values
	 * representing an Item.
	 * 
	 * @param input
	 *            An object of type Get to read from a file or standard input.
	 * @param count
	 *            The record number in the input stream that we will read.
	 * @return An Item or null
	 */
	private Item readItem(Scanner input, int count) throws IOException {
		if (!input.hasNext())
			return null;
		String colorName = input.next();

		//This section converts the First String input to a Color object
		ColorNamer c1 = new ColorNamer(colorName);
		Color color = c1.getAWTColor();
		
		if (color == null) {
			throw new IOException("\n  Color not recognized in record #"
					+ count);
		}

		if (!input.hasNext())
			throw new IOException("\n  No item name found in record #" + count);
		String itemName = input.next();

		int quantity;
		try {
			if (!input.hasNext())
				throw new IOException("\n  No item quantity found in record #"
						+ count);
			quantity = input.nextInt();
		} catch (NumberFormatException e) {
			throw new NumberFormatException(
					"\n  Expecting to read an integer in record #" + count);
		}

		double price;
		try {
			if (!input.hasNext())
				throw new IOException("\n  No item price found in record #"
						+ count);
			price = input.nextDouble();
		} catch (NumberFormatException e) {
			throw new NumberFormatException(
					"\n  Expecting to read a double  in record #" + count);
		}

		Item nextItem = new Item(itemName, color, quantity, price);
		return nextItem;
	}

	
	/**
	 * Print all the items in the database to the standard output for debugging.
	 * 
	 * 
	 */
	public void debugDumpDatabase() {
		// TODO
		
		
	}

	/**
	 * Sorts the database
	 * 
	 * Sorting is always in ascending order on a field determined by Item's
	 * compareMode variable.
	 */
	public void sortDatabase() {
		// TODO: Consider using the sort method of the Java Arrays class.
	}

	/**
	 * Adds an Item to the inventory database
	 * 
	 * @param item
	 *            Item to be added to the database
	 */
	public void addItem(Item newItem) {
		// TODO
	}

} // Inventory


Here is the Item class:

import java.awt.Color;
import java.text.NumberFormat;

import examples.Person;

/**
 * Stores the attributes of an item.
 * 
 * @author Amit Jain
 * @author Jim Conrad
 * @author tjeffs
 */

public class Item implements Comparable<Item> {
	private String name, colorName;
	private Color color;
	private int quantity;
	private double price;

	public enum CompareMode {
		NAME, COLOR, PRICE
	}

//	 public static final int COMPARE_NAME = 1;
//	 public static final int COMPARE_COLOR = 2;
//	 public static final int COMPARE_PRICE = 3;
	 
	private static CompareMode compareMode = CompareMode.NAME;

	/**
	 * Builds an Item
	 * 
	 * @param name
	 *            Name of new item. Note: Space characters in the name will be
	 *            replaced with underscore characters and removes uppercase.
	 * @param color
	 *            Color of new item as defined in
	 *            http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Color.html
	 * @param quantity
	 *            Quantity of new item
	 * @param price
	 *            Price of new item
	 */
	public Item(String name, Color color, int quantity, double price) {
		this.name = cleanUp(name);
		this.color = color;
		this.quantity = quantity;
		this.price = price;
	}

	/**
	 * Returns a String value of an Item for debugging
	 */
	public String toString() {
		NumberFormat fmt = NumberFormat.getCurrencyInstance();
		ColorNamer c1 = new ColorNamer(color);
		String tabs = "\t\t", tabs2 = "\t\t";
		if (name.length() >= 8){
			tabs = "\t";
		} 
		if (c1.getColorName().length() >= 8){
			tabs2 = "\t";
		}
		String result = name + tabs + c1.getColorName() + tabs2 +
						quantity + "\t" + String.format("%15s", fmt.format(price));
		
		return result;
	}

	/**
	 * @param amount
	 *            Added to quantity
	 */
	public void addToQuantity(int amount) {
		quantity = quantity + amount;
	}

	/**
	 * @param amount
	 *            If quantity>=amount, subtracts amount from quantity
	 */
	public void removeFmQuantity(int amount) {
		if (quantity >= amount) {
			quantity = quantity - amount;
		}
	}

	/**
	 * @param newPrice
	 */
	public void setPrice(double newPrice) {
		price = newPrice;
	}

	/**
	 * @param newQty
	 */
	public void setQuantity(int newQty) {
		quantity = newQty;
	}

	/**
	 * @return Item name 
	 */
	public String getName() {
		return name;
	}

	/**
	 * @return Item Color
	 */
	public Color getColor() {
		return color;
	}

	/**
	 * @return Item price
	 */
	public double getPrice() {
		return price;
	}

	/**
	 * @return Item quantity
	 */
	public int getQuantity() {
		return quantity;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	public int compareTo(Item other) {
		//TODO  int compareTo(Item other) returns < 0 if Item precedes other, 0 if Item equals other, or > 0 if Item follows other.
		int result = 0;
		switch (compareMode) {
		case NAME:
			result = name.compareTo(other.name);
			break;
		case COLOR:
			result = color.toString().compareTo(other.color.toString());
			break;
		case PRICE:
			if (price < other.price){
				result = -1;
			} else if (price > other.price){
				result = 1;
			} 
			break;
		}
		return result;
	}

	/**
	 * @return the compareMode
	 */
	public static CompareMode getCompareMode() {
		//TODO static void setCompareMode(int mode) specifies what fields are compared by method 
		//     compareTo: Item.CompareMode.NAME, Item.CompareMode.COLOR, or Item.CompareMode.PRICE. The default compareMode is NAME.
		return compareMode;
	}

	/**
	 * @param compareMode
	 *            the compareMode to set
	 */
	public static void setCompareMode(CompareMode compareMode) {
		Item.compareMode = compareMode;
	}

	/*
	 * Cleans illegal/invalid characters from an Item's name String
	 * 
	 * Note: The encoding used to persist the database fields forbids using a
	 * space in an Item's name.
	 * 
	 * @param name String to be cleaned of illegal/invalid characters.
	 */
	private String cleanUp(String name) {
		name.toLowerCase();
		return name.replaceAll(" ", "_");
	}
}



My professor has provided a test Class to be able to test the Inventory Class. Here it is also:
import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;


public class InventoryTest extends AbstractTestFramework {
	
	//The expected results for test file "data"
	final private static String TEST_DATA_FILENAME="data2";
	final private static int TEST_DATABASE_SIZE=105;
	final private static int TEST_COUNT_RED_TABLES=1;
	final private static int TEST_COUNT_TABLES=6;
	final private static int TEST_COUNT_BLUE=16;
	final private static int TEST_COUNT_PRICE_350=3;
	final private static String TEST_SORTED_FIRST_NAME="airplane";
	final private static double TEST_SORTED_FIRST_PRICE=2999.00;
	final private static int TEST_SORTED_FIRST_QUANTITY=25;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		testConstructor();
		testGetDatabaseSize();
		testSearchByNameAndColor();
		testSearchByName();
		testSearchByColor();
		testSearchByPrice();
		testSortDatabase();
		testAddItem();
		System.out.println("InventoryTest passed");
		System.exit(0);
	}

	private static void testConstructor() {
		startTest();
		Inventory db;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File " + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		} 
		completeTest();
	}

	private static void testGetDatabaseSize() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		assertNotNull(db);
		assertEquals(db.getDatabaseSize(),TEST_DATABASE_SIZE);
		completeTest();
	}
	
	private static void testSearchByNameAndColor() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		Item result[] = db.searchByNameAndColor("table", Color.red);
		assertNotNull(result);
		assertEquals(result.length,TEST_COUNT_RED_TABLES);
		completeTest();
	}
	
	private static void testSearchByName() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		Item result1[] = db.searchByName("table");
		assertEquals(result1.length,TEST_COUNT_TABLES);
		Item result2[] = db.searchByName("sans-quid-nominus");	//Non-existent name.
		assertNull(result2);
		completeTest();
	}
	
	private static void testSearchByColor() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		Item result[] = db.searchByColor("blue");
		assertEquals(result.length,TEST_COUNT_BLUE);
		completeTest();
	}

	private static void testSearchByPrice() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		Item result[] = db.searchByPrice(3.50);
		assertEquals(result.length,TEST_COUNT_PRICE_350);
		completeTest();
	}

	private static void testSortDatabase() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		db.sortDatabase();
		Item items[] = db.getCompleteDatabase();
		assertTrue(items[0].getName().equals(TEST_SORTED_FIRST_NAME));
		assertEquals(items[0].getPrice(),TEST_SORTED_FIRST_PRICE);
		assertEquals(items[0].getQuantity(),TEST_SORTED_FIRST_QUANTITY);
		completeTest();
	}
	
	private static void testAddItem() {
		startTest();
		Inventory db=null;
		try {
			db = new Inventory( new Scanner(new File(TEST_DATA_FILENAME)) );
			assertNotNull(db);
		} catch (FileNotFoundException e) {
			System.out.println("File" + TEST_DATA_FILENAME + " not found");
			failTest();
		} catch (Exception e) {
			e.printStackTrace();
			failTest();
		}
		Item item1 = new Item("foo zot",Color.blue,3,3.33);  //Name has an illegal space
		assertNotNull(item1);
		db.addItem(item1);
		Item item2[] = db.searchByName("foo_zot");  //Item name's space becomes an underscore.
		assertNotNull(item2);
		assertEquals(item2.length,1);
		assertTrue(item2[0].getName().equals("foo_zot"));
		assertEquals(item2[0].getPrice(),3.33);
		assertEquals(item2[0].getQuantity(),3);
		completeTest();
	}
	
	
}



When I run the test class it passes the first few tests just fine, but when it tests my searchbycolorandname method, it throws out this error:
Starting testConstructor
Completed testConstructor
Starting testGetDatabaseSize
Completed testGetDatabaseSize
Starting testSearchByNameAndColor
105
Exception in thread "main" java.lang.NullPointerException
	at Inventory.searchByNameAndColor(Inventory.java:80)
	at InventoryTest.testSearchByNameAndColor(InventoryTest.java:84)
	at InventoryTest.main(InventoryTest.java:27)



The 105 is just a remnant of my attempt to figure out why it's not working.

Any help would be greatly appreciated.

Viewing all articles
Browse latest Browse all 51036

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>