As a supplement to the correct and helpful answer by Sweeper this answer digs a bit deeper. You asked why your parsing threw an exception, and Sweeper already correctly said that it’s because yyyy denotes a variable-width field. I want to show you the two places in the documentation where this is specified. Since for example MM gives a fixed-width field of exactly two digits, one can easily get surprised when neither yyyy nor uuuu gives a fixed-width 4-digit field.
The documentation of DateTimeFormatterBuilder.appendPattern() first refers to DateTimeFormatter for a user-focused description of the patterns. It in turn says specifically about years:
The count of letters determines the minimum field width below which padding is used. … If the count of letters is less than four … Otherwise, the sign is output if the pad width is exceeded, as per
SignStyle.EXCEEDS_PAD.
So this allows yyyy to print, and as a consequence also parse a year with either 4 digits or more than four digits with a sign.
The documentation of DateTimeFormatterBuilder.appendPattern() goes on to specify that appending a pattern of four or more letters y is equivalent to appendValue(ChronoField.YEAR_OF_ERA, n, 19, SignStyle.EXCEEDS_PAD) where n is the count of letters. We see that yyyy allows a field of width 4 through 19.
Links