diff --git a/src/main/java/org/apache/commons/csv/CSVParser.java b/src/main/java/org/apache/commons/csv/CSVParser.java
index e06b95f..94e1dd0 100644
--- a/src/main/java/org/apache/commons/csv/CSVParser.java
+++ b/src/main/java/org/apache/commons/csv/CSVParser.java
@@ -352,6 +352,7 @@
 
         return new CSVParser(new InputStreamReader(url.openStream(), charset), format);
     }
+
     private String headerComment;
 
     private String trailerComment;
@@ -487,8 +488,10 @@
                 }
             } else {
                 if (this.format.getSkipHeaderRecord()) {
-                    final CSVRecord csvRecord = this.nextRecord();
-                    headerComment = csvRecord.getComment();
+                    final CSVRecord nextRecord = this.nextRecord();
+                    if (nextRecord != null) {
+                        headerComment = nextRecord.getComment();
+                    }
                 }
                 headerRecord = formatHeader;
             }
@@ -764,10 +767,8 @@
             case EOF:
                 if (this.reusableToken.isReady) {
                     this.addRecordValue(true);
-                } else {
-                    if (sb != null) {
+                } else if (sb != null) {
                         trailerComment = sb.toString();
-                    }
                 }
                 break;
             case INVALID:
diff --git a/src/test/java/org/apache/commons/csv/CSVParserTest.java b/src/test/java/org/apache/commons/csv/CSVParserTest.java
index 7d2dfbd..46522b1 100644
--- a/src/test/java/org/apache/commons/csv/CSVParserTest.java
+++ b/src/test/java/org/apache/commons/csv/CSVParserTest.java
@@ -1396,6 +1396,7 @@
             .setCommentMarker('#')
             .setHeader("A", "B")
             .build();
+
     @Test
     public void testGetHeaderComment_NoComment1() throws IOException {
 
@@ -1406,6 +1407,7 @@
             assertNull(parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_HeaderComment1() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_COMMENT, FORMAT_AUTO_HEADER)) {
@@ -1415,6 +1417,7 @@
             assertEquals("header comment", parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_HeaderTrailerComment() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_MULTILINE_HEADER_TRAILER_COMMENT, FORMAT_AUTO_HEADER)) {
@@ -1424,6 +1427,7 @@
             assertEquals("multi-line"+LF+"header comment", parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_NoComment2() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_NO_COMMENT, FORMAT_EXPLICIT_HEADER)) {
@@ -1433,6 +1437,7 @@
             assertNull(parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_HeaderComment2() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_COMMENT, FORMAT_EXPLICIT_HEADER)) {
@@ -1442,6 +1447,7 @@
             assertEquals("header comment", parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_NoComment3() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_NO_COMMENT, FORMAT_EXPLICIT_HEADER_NOSKIP)) {
@@ -1451,6 +1457,7 @@
             assertNull(parser.getHeaderComment());
         }
     }
+
     @Test
     public void testGetHeaderComment_HeaderComment3() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_COMMENT, FORMAT_EXPLICIT_HEADER_NOSKIP)) {
@@ -1469,6 +1476,7 @@
             assertNull(parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_HeaderTrailerComment1() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_TRAILER_COMMENT, FORMAT_AUTO_HEADER)) {
@@ -1477,6 +1485,7 @@
             assertEquals("comment", parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_MultilineComment() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_MULTILINE_HEADER_TRAILER_COMMENT, FORMAT_AUTO_HEADER)) {
@@ -1485,6 +1494,7 @@
             assertEquals("multi-line"+LF+"comment", parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_HeaderComment2() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_COMMENT, FORMAT_EXPLICIT_HEADER)) {
@@ -1493,6 +1503,7 @@
             assertNull(parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_HeaderTrailerComment2() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_TRAILER_COMMENT, FORMAT_EXPLICIT_HEADER)) {
@@ -1501,6 +1512,7 @@
             assertEquals("comment", parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_HeaderComment3() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_COMMENT, FORMAT_EXPLICIT_HEADER_NOSKIP)) {
@@ -1509,6 +1521,7 @@
             assertNull(parser.getTrailerComment());
         }
     }
+
     @Test
     public void testGetTrailerComment_HeaderTrailerComment3() throws IOException {
         try (CSVParser parser = CSVParser.parse(CSV_INPUT_HEADER_TRAILER_COMMENT, FORMAT_EXPLICIT_HEADER_NOSKIP)) {
