Как вы пытались проанализировать это?
Если у вас есть отладчик (то есть IDE), анализировать подобные проблемы очень легко.В зависимости от ваших предпочтений, вы можете
- Пошагово выполнять программу от начала до конца
- Установить точку останова на строке, в которую выдается исключение
- Установить точку останова для
NullPointerExceptions
и во всех случаях вы легко увидите, в каком состоянии переменных / полей находятся все точки.Если вы попали в неожиданное состояние, программу можно легко перемотать или запустить заново, чтобы увидеть результаты предыдущих расчетов и посмотреть, где она отклоняется от ваших ожиданий.
Даже если у вас нет отладчика,Вы можете помещать println
операторы в очень часто (и определенно непосредственно перед строкой исключения), чтобы увидеть, какие значения - отладчик бедняка.
А если серьезно, установите настоящий отладчик, есливы будете заниматься любой нетривиальной Java-разработкой.Если это займет 5-20 минут и сэкономит вам больше, чем в первый раз, когда вам придется исследовать проблему, подобную этой.
В любом случае, проблема вызвана тем, что вы никогда ничего не назначаетеполе subsets
, поэтому null
при передаче его в subsetSum
в main
.
Это может быть потому, что локальная переменная subset
в методе getSubsets
затеняет его - есливы ожидали, что этот метод изменит поле, тогда вы ошибетесь.Но тогда, в любом случае, это было бы плохой практикой (ИМХО), поскольку такое изменение состояния в рекурсивном методе было бы очень легко ошибиться, и даже если правильное значение, в любой момент будет трудно рассуждать о классе (как выМне нужно знать, в каком он был состоянии).Присвоение результатов полям - распространенная ошибка новичка (возможно, потому, что он чувствует себя более объектно-ориентированным?), Когда лучшим вариантом является метод , возвращающий его результат, который затем обычно сохраняется в локальной переменной.
Таким образом, метод main
должен присвоить результат вызова getSubsets
локальной переменной, а затем передать this в метод subsetSum
.
(Я заметил, что типы не полностью совместимы - вы уверены, что аргумент subsetSum
тоже не должен быть Vector<Vector<Integer>>
? В настоящий момент похоже, что вы могли передать только одно подмножество. Но этодругое дело.)