Wychodzisz poza zakres stringa w dwóch miejscach:
napis[i + 1]
napis[j + 1]
a maksymalne i oraz j wynosi napis.length() - 1.
Działało to troszkę przez przypadek, bo bazowało na napis[dlugosc] == ' ', co nie jest gwarantowane w żaden sposób.
A poza tym to rozwiązanie jest strasznie przekombinowane :P. Iterujesz po całym stringu kilka razy, przepisujesz wartości podczas gdy można całość zrobić jedną iteracją.