Un while(true){vacio} no es realmente dañino, no va a romper nada.
Pero va a hacer que el programa se quede bloqueado, ya que ese bucle no va a finalizar nunca, así que vamos a tener un programa que no está haciendo nada, a parte de consumir recursos de CPU inútilmente.
Esto es aplicable a cualquier lenguaje de programación: Java, C++, Python, Pascal,...el que sea.
Un while(true) que sí contenga código, si dicho código incorpora una condición para que en algún momento el bucle finalice, pues no habrá ningún problema.
Sin embargo, es una mala práctica de programación. Un while(true) no debería utilizarse nunca, ya no solo por el riesgo de crear un bucle infinito, si no porque un código ha de ser legible y entendible, para que pueda ser mantenido correctamente por otros programadores que no fueron los creadores de ese código.
Hay que cuidar cosas, como que los nombres de las variables sean descriptivos y que las expresiones en el código den una idea clara de cuál es la condición que se está evaluando.
Un bucle while, se ha de ejecutar mientras una condición se cumpla.
Si yo tengo que mantener un código y me encuentro un
while(true), veo que hay un bucle..., pero no veo cuál es la condición que va a poner fin a ese bucle.
Voy a tener que seguir explorando código hasta encontrar una sentencia break, o un goto,(según el lenguaje) para adivinar cuál es la condición.
Y hasta encontrarla, pues a lo mejor tengo que leer 10 líneas, o 100 líneas,.. o 500 líneas..., nunca se sabe.
Dicha condición, debería estar dentro del paréntesis del while(), no perdida entre decenas de líneas de código.
Un ejemplo sencillo.
Un programa para pedir número por teclado y sumarlos.
Tras cada número, preguntamos si quiere introducir otro (si/no)
Cuando diga que "no", mostramos la suma y el programa termina.
En este código, estoy usando un while(true), y dentro del bucle, tengo un if donde lo que hago es "romper"(break) el bucle.
El programa funciona perfectamente, no se bloquea y no es dañino.
Pero es una mala práctica. El bucle no debería "romperse" según una condición que se comprueba en alguna parte de su cuerpo, debe finalizar de forma "natural" según la condición que claramente ha de visibilizarse en el paréntesis del while.
Solo hay que cambiar un poco el código, incluso nos ahorramos un par de líneas.
Y ahora si es un código más entendible, al llegar al while, inmediatamente vemos que este bucle se va a repetir mientras el usuario responda "si" a la pregunta.
No solo se facilita la comprensión del código, si no también su mantenimiento. Al tener la condición tan a la vista, si deseo cambiar esa condición o incluso añadir otra más, lo tengo fácil porque lo hago ahí en el paréntesis del bucle. No hay que buscar nada dentro del bucle.
Este es un ejemplo sencillo, y la diferencia entre una forma y otra es mínima.
Pero en un programa real, que puede contener miles de líneas de código, encontrarse con while(true) es una pesadilla y síntoma de una mala práctica en la programación.
Y me sorprende ver que aún hay profesores que lo enseñan como una práctica aceptable.
Un saludo.