в чем она здесь заключается? про суть отката при ошибке понятно, то есть, нужно представить ситуацию, что при переписывании строк из 1 файла(читаем первую строку - путь к файлу)->записываем в allLines и из 2 файлы(другая строка с консоли, отличающейся от 1 файла)->записываем в forRemoveLines из 1 файла данные из-за "сбоя" записались и в allLines и в forRemoveLines повторно (на них ведь делается проверка с выбросом ошибки)? Сделать метод joinData транзакционным, т.е. если произошел сбой, то данные не должны быть изменены. то есть цель оставить списки пустыми?
public class Solution {
    public static List<String> allLines = new ArrayList<String>();
    public static List<String> forRemoveLines = new ArrayList<String>();


    public static void main(String[] args) throws CorruptedDataException {
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
            allLines = Files.readAllLines(Paths.get(reader.readLine()));
            forRemoveLines = Files.readAllLines(Paths.get(reader.readLine()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        new Solution().joinData();
    }

    public void joinData() throws CorruptedDataException {
        if (allLines.containsAll(forRemoveLines)) {
            allLines.removeAll(forRemoveLines);
        }
        else {
            allLines.clear();
            throw new CorruptedDataException();
        }
    }
}