По первой ошибке: считывание прекращается, при вводе несоответствующего ключа.
По второй: я через цикл забрасываю полученные ключи из списка в указанный метод MovieFactory.getMovie().
По третьей: выводится.
package com.javarush.task.task14.task1414;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) throws Exception {
//ввести с консоли несколько ключей (строк), пункт 7
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
ArrayList<String> list = new ArrayList<String>();
String key = null;
for(int i = 0 ; ; i ++){
key = reader.readLine();
list.add(key);
if (!((list.get(i).equals("cartoon")) || (list.get(i).equals("thriller")) ||
(list.get(i).equals("soapOpera"))))
{break;}
}
/*
8 Создать переменную movie класса Movie и для каждой введенной строки(ключа):
8.1 получить объект используя MovieFactory.getMovie и присвоить его переменной movie
8.2 вывести на экран movie.getClass().getSimpleName()
*/
Movie movie;
for (int j = 0; j < list.size(); j++) {
movie = MovieFactory.getMovie(list.get(j));
System.out.println(movie.getClass().getSimpleName());}
}
static class MovieFactory {
static Movie getMovie(String key) {
Movie movie = null;
//создание объекта SoapOpera (мыльная опера) для ключа "soapOpera"
//5. Добавить в MovieFactory.getMovie получение объекта Cartoon для ключа "cartoon".
//6. Добавить в MovieFactory.getMovie получение объекта Thriller для ключа "thriller".
if ("soapOpera".equals(key)) {
movie = new SoapOpera();}
if ("cartoon".equals(key)){
movie = new Cartoon();}
if ("thriller".equals(key)){
movie = new Thriller();}
return movie;}
}
static abstract class Movie { }
static class SoapOpera extends Movie { }
public static class Cartoon extends Movie { }
public static class Thriller extends Movie{ }
}