code: public int readTag() throws IOException {
      if (isAtEnd()) {
        lastTag = 0;
        return 0;
      }
  
      final int tag = readRawVarint32();
      if (tag >>> WireFormat.TAG_TYPE_BITS == 0) {
        // If we actually read zero, that's not a valid tag.
        throw ProtobufException.invalidTag();
      }
      lastTag = tag;
      return tag;
    }
docs: Attempt to read a field tag, returning zero if we have reached EOF.
  Protocol message parsers use this to read tags, since a protocol message
  may legally end wherever a tag occurs, and zero is not a valid tag number.