diff --git a/sequencing/src/main/java/org/biojava/bio/program/fastq/FastqParser.java b/sequencing/src/main/java/org/biojava/bio/program/fastq/FastqParser.java index 7a01ab8..af997c8 100644 --- a/sequencing/src/main/java/org/biojava/bio/program/fastq/FastqParser.java +++ b/sequencing/src/main/java/org/biojava/bio/program/fastq/FastqParser.java @@ -49,16 +49,24 @@ static void parse(final Readable readable, final ParseListener listener) { throw new IllegalArgumentException("readable must not be null"); } - FastqParserLineProcessor lineProcessor = new FastqParserLineProcessor(listener); - CharStreams.readLines(readable, lineProcessor); - if (lineProcessor.getState() == State.COMPLETE) + final FastqParserLineProcessor lineProcessor = new FastqParserLineProcessor(listener); + try { - listener.complete(); - lineProcessor.setState(State.DESCRIPTION); + CharStreams.readLines(readable, lineProcessor); + + if (lineProcessor.getState() == State.COMPLETE) + { + listener.complete(); + lineProcessor.setState(State.DESCRIPTION); + } + } + catch (IOException e) + { + throw new IOException("parse error at line " + lineProcessor.getLineNumber() + ", state " + lineProcessor.getState(), e); } if (lineProcessor.getState() != State.DESCRIPTION) { - throw new IOException("truncated sequence"); // at line " + lineNumber); + throw new IOException("truncated sequence at line " + lineProcessor.getLineNumber()); } } @@ -70,6 +78,9 @@ private static class FastqParserLineProcessor implements LineProcessor /** Parser state. */ private State state = State.DESCRIPTION; + /** Line number. */ + private long lineNumber = 0; + /** Sequence length. */ private int sequenceLength = 0; @@ -115,6 +126,16 @@ private void setState(final State state) this.state = state; } + /** + * Return the line number. + * + * @return the line number + */ + private long getLineNumber() + { + return lineNumber; + } + @Override public Object getResult() { @@ -124,6 +145,8 @@ public Object getResult() @Override public boolean processLine(final String line) throws IOException { + lineNumber++; + String sequence = null; String quality = null; switch (state)