The ZkStateReader in 8.x (and previous versions) checks that a /clusterstate.json node exists in the ZK ChRoot, to ensure that the ChRoot hosts a Solr Cloud. However, starting in 9.0, /clusterstate.json has been removed, and it is auto-deleted if a user tries to create one.
That means that the ZkStateReader from SolrJ 8.x will error when trying to connect with a Solr 9 cloud, with the message:
Cannot connect to cluster at localhost:2181/: cluster not found/not ready
The solution, is to have the ZK State Reader check both /clusterstate.json and /collections and only error if both are missing. /clusterstate.json is long-deprecated in 8.x anyways, so adding this additional check is good practice in general.
While it would be nice for every user to use the same SolrJ version as the version they are running for Solr, it can be difficult in practice, especially when upgrading major Solr versions. It would be preferable to support at least version + 1 clouds in SolrJ, for the purpose of upgrades.