The solution (freezing out the bad player) has its own issues.
Say Josh had decided simply not to play the unreliable player. What does that player do? Does the player consider what he may have done to warrant such treatment?
Nope. He bashes the captain to anyone who will listen. He assumes the reason he isn't in the line-up is that the captain is incompetent, doesn't recognizes his tennis genius, the captain is biased in favor of others, or it's an oversight.
Eventually, he will just ask the captain why he isn't playing. The captain will have to explain the issue with reliability (or whatever it is).
Rather than go through all that, perhaps it is better to just confront the player from the get-go and say, "Bill, I'd like to play you more, but we've had two instances when you were late. I can't take a chance on a default."
I have confronted two players about problematic behavior. In both cases it was because of unsportsmanlike behavior that made people reluctant to partner with them. In both cases, the players left the team of their own accord.
Honesty -- the best freeze-out of all!