Por que a variável nao foi inicializada?

[color=blue]public class[/color] ListaDeExercicios2 {

[color=blue]public static void[/color] main(String[] args) {

    [color=blue]boolean[/color] temErro = true;
    Scanner sc = [color=blue]new[/color] Scanner(System.in);
    [color=blue]Double[/color] altura = new Double(0);
    [color=blue]Double[/color] largura = new Double(0);
    
    [color=blue]while[/color] (temErro == [color=blue]true[/color]) {

        System.out.println("Digite a altura.");
        altura = sc.nextDouble();

        [color=blue]if[/color] (altura > 0) {
            temErro = [color=blue]false[/color];
        } else {
            System.out.println("Valor inválido.");
        }

    }
    temErro = [color=blue]true[/color];

   [color=blue] while[/color] (temErro == [color=blue]true[/color]) {

        System.out.println("Digite a largura.");
        largura = sc.nextDouble();
        
        [color=blue]if[/color] (largura > 0) {
            temErro = [color=blue]false[/color];
        } [color=blue]else {
            System.out.println("Valor inválido");
        }
    }

    Retangulo retangulo1 = [color=blue]new[/color] Retangulo(altura, largura);
    System.out.println(retangulo1.getComprimento() + " comprimento " + retangulo1.getLargura() + " largura." + retangulo1.perimetro() + " perimetro " + retangulo1.area() + " area.");

}

}

usando Double altura = new Double(0); e Double largura = new Double(0); o programa funciona perfeitamente, porém sem eles e declarando a variável dentro do while da erro na hora de criar um novo retangulo, ele fala que a variável nao foi inicializada.

Já tentei inicializar ela desse modo no começo do código:
double altura;
double largura;

mas mesmo assim o erro continua, só quando eu uso wrapper que funciona…pq??

Se vc criar e declarar as variáveis dentro do comando while, elas só irão estar disponíveis dentro daquele bloco de repetição, quando o mesmo acabar não tem como usa-las, e como vc utiliza elas para realizar cálculos fora do while, ocorre o erro, e em relação a wrapper ou tipo primitivo não faz sentido algum.

Dá esse erro porque de fato a variável não foi inicializada.
Tenta assim;

double altura =0;
double largura = 0;

E depois disso passa sua lógica normalmente.

O que esta acontecendo é que quando você chama a altura dentro do laço while ela so funciona naquele momento, quando o laço termina a variavel nao mais será usado.

Agora com relação ao fato de funcionar com as wrapper ele funciona porque o 0 que você passa como parâmetro para o objeto já é por si só um valor double,
Note que se você não colocar o 0 Double altura = new Double(); , dará erro.
Porque a wrapper que você esta usando exige que seja passado um parâmetro para ela. Neste caso um double.

Acredito que o raciocinio seja por ai.

Espero ter te ajudado.