Null Pointer Exception e não sei por que, podem me ajudar? já queimei os neurônios aqui e nada '~'

O teste seguido do erro foi o seguinte:

Quantas formas deseja criar?
1
Escolha a 1ª forma
1 - Quadrado
2 - Retangulo
3 - Circulo
1
Você escolheu criar um quadrado, informe o lado do quadrado:
4
Exception in thread “main” java.lang.NullPointerException
at ExecInterfaces.ProgramaPrincipal.main(ProgramaPrincipal.java:33)

CÓDIGO DA CLASSE main:

package ExecInterfaces;

import java.util.Scanner;

public class ProgramaPrincipal {

public static void main(String[] args){
		
	Scanner scan = new Scanner(System.in);
	
	int quantiaDeFormas;
	int escolhaDaForma;
			
	System.out.println("Quantas formas deseja criar?");
	quantiaDeFormas = scan.nextInt();
	
	Quadrado[] quadrado = new Quadrado[quantiaDeFormas];
	Retangulo[] retangulo = new Retangulo[quantiaDeFormas];
	Circulo[] circulo = new Circulo[quantiaDeFormas];
	
	for(int i = 0; i < quantiaDeFormas; i++){
		System.out.println("");
		System.out.println("Escolha a " + (i+1) + "ª forma");
		System.out.println("1 - Quadrado");
		System.out.println("2 - Retangulo");
		System.out.println("3 - Circulo");
		System.out.println("");
		escolhaDaForma = scan.nextInt();
		while((escolhaDaForma != 1) || (escolhaDaForma != 2) || (escolhaDaForma != 3)){
			switch(escolhaDaForma){
				case 1:
					System.out.println("Você escolheu criar um quadrado, informe o lado do quadrado: ");
					quadrado[i].setLado(scan.nextDouble());
					System.out.println("Quadrado criado com sucesso");
					break;
				case 2:
					System.out.println("Você escolheu criar um retangulo, informe a base do retangulo: ");
					retangulo[i].setBase(scan.nextDouble());
					System.out.println("Agora informe o a altura do retangulo");
					retangulo[i].setAltura(scan.nextDouble());
					System.out.println("Retangulo criado com sucesso");
					break;
				case 3:
					System.out.println("Você escolheu criar um circulo, informe o raio do circulo: ");
					circulo[i].setRaio(scan.nextDouble());
					System.out.println("Circulo criado com sucesso");
					break;
				default:
					System.out.println("Opção inválida");
					System.out.println("");
					System.out.println("Escolha a " + (i+1) + "ª forma");
					System.out.println("1 - Quadrado");
					System.out.println("2 - Retangulo");
					System.out.println("3 - Circulo");
					escolhaDaForma = scan.nextInt();
					break;
			}
		}
	}
}

}

CÓDIGO DA CLASSE Quadrado:

package ExecInterfaces;

public class Quadrado extends Quadrilateros{

private double lado;

public Quadrado(double l){
	this.lado = l;
}

public Quadrado(){
	
}

public void setLado(double lado) {
	this.lado = lado;
}

public double getLado() {
	return lado;
}

@Override
public double calcPerimetro() {
	return lado * 4;
}

@Override
public double calcArea() {
	return lado * lado;
}

}

CÓDIGO DA CLASSE Quadrilatero:

package ExecInterfaces;

public abstract class Quadrilateros implements Calculavel{

private double l1;
private double l2;
private double l3;
private double l4;

public Quadrilateros(double l1, double l2, double l3, double l4){
	this.l1 = l1;
	this.l2 = l2;
	this.l3 = l3;
	this.l4 = l4;
}

public Quadrilateros(){
}

public void setL1(double l1) {
	this.l1 = l1;
}

public void setL2(double l2) {
	this.l2 = l2;
}

public void setL3(double l3) {
	this.l3 = l3;
}

public void setL4(double l4) {
	this.l4 = l4;
}

public double getL1() {
	return l1;
}

public double getL2() {
	return l2;
}

public double getL3() {
	return l3;
}

public double getL4() {
	return l4;
}

}

CÓDIGO DA INTERFACE Calculavel:

package ExecInterfaces;

public interface Calculavel {

public double calcPerimetro();
public double calcArea();

}

Desde já agradeço a ajuda pessoal :smiley:

Quando você instancia um array de objetos, como Quadrado[] por exemplo, o que é alocado é o espaço para as referências, e não os objetos Quadrado em si.

int quantidade = 5;
Quadrado[] quadrados = new Quadrado[quantidade];

A segunda linha, do new, cria a seguinte estrutura:

[null, null, null, null, null]

Não existem quadrados nesse array, apenas espaços onde cabem quadrados. Você precisa instanciar um por um, cada quadrado, e passa-los ao array.

for (int i = 0; i < quantidade; i++) {
    quadrados[i] = new Quadrado();
}

Agora a estrutura está assim:

[Quadrado 0, Quadrado 1, Quadrado 2, Quadrado 3, Quadrado 4]

E você pode, portanto, fazer isso:

quadrados[2].setLado(scanNextDouble());
2 curtidas

Entendi brother, muito obrigado pela explicação :smiley:

Eu percebi que vou ter outro problema, quando o usuario quiser criar várias formas e elas forem diferentes, eu vou criar objetos em lugares diferentes dos arrays, por exemplo, quadrado1 vai na posição 0 do array quadrado mas circulo1 vai ficar na posição 1 do array circulo por causa da forma que fiz a lógica com o for, quando eu for ler o array vai dar que o circulo na posição0 está null.

agora a pergunta: existe uma forma de eu printar objetos desse array somente o que não for null?

if (! quadrado[i] == null)
    System.out.println(quadrado[i]);
1 curtida

vlw mais uma vez, Deus te abençoe :smiley: