Я наблюдаю, что вы не обладаете хорошим знанием логики программирования. Вам также необходимо дополнительно понять поток времени выполнения Java и поведение языка. Тем не менее, логический поток - это навык, который вам необходимо приобрести, независимо от того, общаетесь ли вы на Java, C, C ++ или английском языке. (Кстати, английский язык, несмотря на наличие противоречивых синтетических элементов, является аналитически логичным языком.)
Сначала вы объявляете статические myFavouriteMovies и создаете их экземпляр для ArrayList. После этого вы приравниваете его к нулю. Приравнивая переменную к нулю, вы пытаетесь использовать ее как
myFavouriteMovies.add(TempMovie);
Конечно, вы получите нулевой указатель.
Вам необходимо ознакомиться с дампами ошибок компилятора и среды выполнения. Ошибка времени выполнения Java, безусловно, указала бы на номер выписки, в котором она обнаружила вашу попытку снять деньги с пустого банковского счета, не защищенного от овердрафта.
Программы на C #, написанные "экспертами VB", всегда расстраивают меня. Я понимаю, что это не очень хороший ответ, но я очень самонадеянно заявляю, что вы, скорее всего, опытный программист на Visual Basic. Поэтому я пользуюсь дополнительной возможностью для всех опытных программистов на Visual Basic, бросая соль на открытую рану (соль является дезинфицирующим средством), чтобы вы НИКОГДА не передавали свои знания в области программирования на языке объектных ссылок на объектно-ориентированные языки. Подобно тому, как опытному носителю синтетического логического языка, такого как греческий или иврит, трудно приспособиться к аналитически логическому языку, такому как английский, и наоборот.
Во-вторых, с чем связано объявление myFavouriteMovies в качестве статического? Вы понимаете значение статической переменной?
В-третьих, вы не должны ссылаться на статическую переменную через ссылку на экземпляр класса "this". myFavouriteMovies - это статическая переменная в классе Movie. Поэтому вы должны ссылаться на него как
Movie.myFavouriteMovies
а не как
this.myFavouriteMovies
Java позволяет вам выполнять такие аберрационные ссылки, но C # не будет. «this» следует зарезервировать для «переменных экземпляра».
Наконец, по сравнению с другими "экспертами по VB", существует высокая вероятность того, что вам потребуется дополнительное понимание того, какие переменные экземпляра являются статическими переменными. Статическая переменная существует без необходимости создания экземпляра класса. Следовательно, он «разделяется» всеми экземплярами класса; и если он является общедоступным или защищенным, он используется совместно с любыми элементами процесса, которым подвергается эта статическая переменная.
Обычно, когда у вас есть статический список, ваш метод get не должен возвращать ссылку на эту статическую переменную. Вы должны вернуть подмножество списка. Например, вы можете иметь статический список всех поклонников каждого фильма. Когда вам нужно вернуть список из списка Поклонников определенного фильма, вы не возвращаете весь статический список, а только подмножество этого статического списка. Вы должны понимать, когда можно использовать статические переменные, и ограничивать себя в развертывании статических ссылок. Это означает, что НЕ объявляйте статическую переменную, если сделаете ее экземпляром класса.
Вы можете использовать статическую переменную для отслеживания и ограничения того, что класс Movie не создается более чем, скажем, пять раз или что в настоящее время не более пяти экземпляров, увеличивая статический счетчик каждый раз, когда он создается, и уменьшая каждый раз это уничтожено. Вы можете использовать статическую переменную для хранения пула соединений с базой данных, где каждое соединение является экземпляром соединения.
Маленькие мелочи:
Знаете ли вы, что вы можете выполнять статические манипуляции в Java, используя статический блок? Если имеется более одного статического блока, они будут обрабатываться в порядке их объявления. Как обычно, любая переменная, объявленная внутри блока кода, не видна за пределами этого блока.
class Hello{
static {
// perform static manipulation here
}
public void setAnInstanceValue(int a){
...
}
static {
// another static block of code here
}
.....
}
Вы должны попытаться создать экземпляр ваших статических переменных в блоке статического кода.Если вы обнаружите, что можете создать экземпляр статической переменной в конструкторе экземпляра, существует высокая вероятность того, что она не должна быть статической.
Читать это: Поток выполнения для блока статического кода - http://forums.sun.com/thread.jspa?threadID=5418566. 2017-06-30: эта тема на солнечном форуме была заархивирована на https://community.oracle.com/message/5266256#5266256, для доступа к которой требуется регистрация оракула.