Для этих сценариев я хотел бы использовать небольшой помощник, подобный этому:
/**
* Accesses nested properties and returns a default value if it encounters null or undefined along the way.
* @param fallback A fallback value if any property or its value is null or undefined.
* @param path The path to access a nested property
*/
export const propOrDefault = (fallback: R) => (...path: string[]) => (obj: T | null | undefined): R =>
path.reduce((partialObj, propertyName) => {
if (partialObj && propertyName && partialObj.hasOwnProperty(propertyName)) {
return partialObj[propertyName] || fallback;
}
return fallback;
}, obj);
Это TypeScript, но он должен получить точку. Дополнительная информация о типе может помочь с пониманием.
Пример использования:
const isValid = propOrDefault(0)('staff', 'members', 'length')(state) < 5;
Как вы можете видеть, этот помощник использует currying , чтобы вы могли предварительно -конфигурируйте его для последующего использования следующим образом:
const propOrTen = propOrDefault(0);
const countStaffMembers = propOrTen('staff', 'members', 'length');
const result = countStaffMembers(state);
Там есть множество библиотек с подобными инструментами, такими как lodash и ramda .
Вы получаете NullPointerException
, потому что sales
это null
в строке for (row = 0; row < sales.length; row++)
.
Даже если вы установите значение переменной sales
в конструкторе Sales()
, вы никогда не вызовете этот конструктор (как new Sales()
).
Итак, чтобы исправить это NullPointerException
, вы можете вызвать конструктор Sales
в методе main()
следующим образом:
public static void main(String[] args)
{
new Sales();
calCityTotal();
calMonthlyTotal();
displayTable();
}
РЕДАКТИРОВАТЬ
После исправления NullPointerException
в вашем коде осталось еще несколько проблем.
Внутри calCityTotal()
, sales[0].length
следует исправить как sales[row].length
, я думаю.
citySum
массив инициализируется до длины sales
. Это означает, что citySum.length
равно количеству «строк». Но затем вы пишете citySum[col]
, что может привести к ArrayIndexOutOfBoundsException
, потому что число «столбцов» может превышать citySum.length
. (Это действительно происходит в вашей программе. Потому что число строк = 5 и количество столбцов = 6.)