Wei, Yep, SourceThread.run() in Mupd8Main wraps a try-catch-all around the hasNext() and getNextDataPair() so the system swallows all exceptions thrown from JSONSource.

My consideration is that maybe it'd be nice to have SourceThread to automatically detect any failed source reader and performs error-correction such as create a new source reader.  In the light of this thought, some kind of communication needs to come across from failed source reader to Mupd8Main.  So here it throws a NoSuchElementException to let Mupd8Main deal with it.