I am not sure recursion is a good idea here. We should have a loop with a limited number of iterations (i.e. attempts to obtain a new port). Otherwise, the app will explode if no port can be obtained (e.g. because of some external firewall settings).
Also, in general, we should initialize the data first and then assign stuff to the member variables - think exception/thread safety in C++. e.g. I would write something like this:

```java
for (int attempt = 1; attempt < maxAttempts; ++attempt) {
  final int port = getNextPort();
  final Server srv = new Server(port);
  try {
    srv.start();
    synchronized (this) { // Not necessary in the constructor; here to illustrate the point.
      this.server = srv;
      this.port = port;
      return;
    }
  } catch (final BindException ex) {
    LOG.log(Level.WARN, "Cannot use port: " + port, ex);
  }
}
throw new RuntimeException("Could not find available port in " + maxAttempts + " attempts);
```