Un rompecabezas de Java Random y StringBuffer

Predecir la salida del programa

import java.util.Random;
public class GFG {
    private static Random rd = new Random(); 
    public static void main(String[] args) {
    StringBuffer word = null;
    switch(rd.nextInt(2)) {
        case 1: word = new StringBuffer('P');
        case 2: word = new StringBuffer('G');
        default: word = new StringBuffer('M');
    }
    word.append('a');
    word.append('i');
    word.append('n');
    System.out.println(word);
    }
}

Solución:
A primera vista, podría parecer que este programa imprime las palabras Pain, Gain y Main con la misma probabilidad, variando de una ejecución a otra. Pero la salida del programa siempre es ain .
Tres errores conspiran para causar este comportamiento. Veámoslos individualmente:
1. rd.nextInt(2) devolverá un número entre 0 (inclusive) y 2 (exclusivo), que son 0 y 1. Por lo tanto, nuestro programa nunca imprime ‘Pain’.

2. El segundo error es que no hay instrucciones de interrupción entre los casos. Cualquiera que sea el valor de la expresión de cambio, el programa ejecutará ese caso y todos los casos subsiguientes. Cada caso asigna un valor a la palabra variable y gana la última asignación. La última asignación siempre será la del caso final (por defecto), que es new StringBuffer(‘M’). Esto sugiere que el programa nunca imprimirá ‘Ganancia’ tampoco.

3. El último y más sutil error es que la expresión new StringBuffer(‘M’) probablemente no hace lo que crees que hace. No hay un constructor StringBuffer(char). Pero hay uno que lleva un int indicando su capacidad inicial. En este caso, el compilador selecciona el constructor int, aplicando una conversión primitiva de ampliación para convertir el valor char ‘M’ en el valor int 77. En
otras palabras, new StringBuffer(‘M’) devuelve un búfer de string vacío con una capacidad inicial de 77. El resto del programa agrega los caracteres a, iyn al búfer de string vacío e imprime su contenido, que siempre es ‘ain’.

Este artículo es una contribución de Shubham Juneja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *