code: public int readTag() throws IOException
      {
          if (offset == limit)
          {
              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.