Dúvida na criação de matrizes quando não sei a quantidade de linhas

Oi, gente!

Estou iniciando em programação, no 2º semestre de ADS, e preciso fazer um projeto. Ele consiste em fazer um sistema para uma concessionária, e a ideia é que no menu principal, o usuário possa optar por cadastrar, editar, vender e excluir um veículo.

Mas estou completamente travada no método para cadastro, pois não estou conseguindo criar a matriz para inserir os carros a serem cadastrados no estoque. O código está assim:

public void cadastraCarro(String marca, String modelo, String tipoComb, String estado, String placa, String cambio, String doc, String motor /**int ano**/ /**float valor**/){
        int soma, estoque;
        soma = 0;
        estoque = 0;
        String matriz[][];
        matriz = new String [estoque] [9];
        JOptionPane.showMessageDialog(null, "Existe 0 carros no estoque. Aperte enter para acrescentar um novo carro.");
        estoque = Integer.parseInt(JOptionPane.showInputDialog("Informe quantos carros tem no estoque atualmente: "));
        
        soma = estoque + 1;
        
        for(int i = 0; i < estoque; i++ ){    
            for (int j = 0; j < 9; j++){
            
            //ano = Integer.parseInt(JOptionPane.showInputDialog("Digite o ano do carro: "));
            //valor = Float.parseFloat(JOptionPane.showInputDialog("Digite o valor do carro: "));
            marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
            marca = matriz[estoque][0];
            modelo = JOptionPane.showInputDialog("Digite o modelo do carro:");
            modelo = matriz[estoque][1];
            tipoComb = JOptionPane.showInputDialog("Digite o tipo de combustível do carro: ");
            tipoComb = matriz[estoque][2];
            //Integer.toString(ano);
            motor = JOptionPane.showInputDialog("Digite o motor do carro: ");
            motor = matriz[estoque][3];
            cambio = JOptionPane.showInputDialog("Digite o tipo de câmbio do carro: ");
            cambio = matriz[estoque][4];
            //Double.toString(valor);
            estado = JOptionPane.showInputDialog("O carro é seminovo? (S/N)");
            estado = matriz[estoque][5];
            if (estado.equals("S") || estado.equals("s")){
                placa = JOptionPane.showInputDialog("Digite a placa: ");
                placa = matriz[estoque][6];
                doc = JOptionPane.showInputDialog("O documento está em dia? (S/N)");
                doc = matriz[estoque][7];
                JOptionPane.showMessageDialog(null, "Você cadastrou o veículo seminovo com sucesso! \nModelo: " + modelo + ".\n Marca: " + marca + ".\nTipo de Combustível: " + tipoComb + ". \nAno do Veículo: " + ano + ". \nTipo de motor: " + motor + ". \nTipo de câmbio: " + cambio + ". \nValor: R$" + valor + ". \nPlaca: " + placa + ". \nO documento está em dia? " + doc + ".");
            }
            else {
                JOptionPane.showMessageDialog(null, "Você cadastrou o veículo seminovo com sucesso! \nModelo: " + modelo + ".\n Marca: " + marca + ".\nTipo de Combustível: " + tipoComb + ". \nAno do Veículo: " + ano + ". \nTipo de motor: " + motor + ". \nTipo de câmbio: " + cambio + ". \nValor: R$" + valor + ". \nPlaca: " + placa + ". \nO documento está em dia? " + doc + ".");
                placa = null;
                placa = matriz[estoque][6];
                doc = null;
                doc = matriz[estoque][7];
            }
            ativo = "1";    
        }
    }
        
        
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][0]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][1]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][2]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][3]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][4]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][5]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][6]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][7]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][8]+"\t");
                JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][9]+"\t");
    }               

Uma bagunça, eu sei. rs
Não estou conseguindo fazer rodar e visualizar a matriz após pronta.
Alguém poderia me ajudar?

Ps: é a primeira vez que uso o site, então não sei pq o código não foi inteiro dentro da área destinada pra ele. Foi mal. lol

Achei o código meio confuso, mas pelo que entendi, vi 2 erros graves.

O primeiro é que aquele segundo FOR não é necessário.

O segundo é que vc pede pro usuário digitar alguma coisa e logo depois vc sobrescreve.

// Pede o valor
marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
// Sobrescreve o valor
marca = matriz[estoque][0];

O correto seria o contrário:

// Pede o valor
marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
// Guarda valor na matriz
matriz[estoque][0] = marca;

Modifiquei um pouco seu código, não sei se te atende, mas eu fiz pra vc ter uma ideia de como é pra ficar, veja:

public void cadastraCarro() {
  int estoque = Integer.parseInt(JOptionPane.showInputDialog("Informe quantos carros tem no estoque atualmente: "));
  String[][] matriz = new String[estoque][9];
  JOptionPane.showMessageDialog(null, "Existe 0 carros no estoque. Aperte enter para acrescentar um novo carro.");

  for (int i = 0; i < estoque; i++) {
    String marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
    String modelo = JOptionPane.showInputDialog("Digite o modelo do carro:");
    String tipoComb = JOptionPane.showInputDialog("Digite o tipo de combustível do carro: ");
    String motor = JOptionPane.showInputDialog("Digite o motor do carro: ");
    String cambio = JOptionPane.showInputDialog("Digite o tipo de câmbio do carro: ");
    String estado = JOptionPane.showInputDialog("O carro é seminovo? (S/N)");
    String valor = JOptionPane.showInputDialog("Digite o valor");
    String ano = JOptionPane.showInputDialog("Digite o ano");
    String placa = JOptionPane.showInputDialog("Digite a placa: ");
    String doc = JOptionPane.showInputDialog("O documento está em dia? (S/N)");

    String mensagem = "";

    if (estado.equalsIgnoreCase("S")) {
      mensagem = "Você cadastrou o veículo seminovo com sucesso!";
    } else {
      mensagem = "Você cadastrou o veículo novo com sucesso!";
    }

    JOptionPane.showMessageDialog(null,
        mensagem + "\nModelo: " + modelo + ".\n Marca: " + marca + ".\nTipo de Combustível: " + tipoComb
            + ". \nAno do Veículo: " + ano + ". \nTipo de motor: " + motor + ". \nTipo de câmbio: " + cambio
            + ". \nValor: R$" + valor + ". \nPlaca: " + placa + ". \nO documento está em dia? " + doc + ".");

    matriz[estoque][0] = marca;
    matriz[estoque][1] = modelo;
    matriz[estoque][2] = tipoComb;
    matriz[estoque][3] = motor;
    matriz[estoque][4] = cambio;
    matriz[estoque][5] = estado;
    matriz[estoque][6] = placa;
    matriz[estoque][7] = doc;
  }

  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][0] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][1] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][2] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][3] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][4] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][5] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][6] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][7] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][8] + "\t");
  JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + matriz[estoque][9] + "\t");
}

Uma dúvida: Vc tem mesmo que usar uma matriz? Não poderia criar uma classe Carro e fazer algo assim:

class Carro {
  /* ... */
}

Carro[] carros = new Carro[estoque];

Quando não se conhece a quantidade de registros que vai cadastrar, o correto é usar uma estrutura com alocação dinâmica de memória ao invés de usar matrizes.

Outra coisa, você precisa usar uma matriz de String?

Não poderia usar uma lista ou um vetor de Carro?

@wldomiciano

Obrigada pela ajuda!

Fiz algumas alterações na ordem do código que você me mandou pra ficar dentro do que eu preciso, e rodou direitinho. Só fiquei com uma dúvida:

Nessa parte do estoque, eu havia entendido que seria necessário fazer o for a partir da soma do estoque + 1 (pra que não acabasse sobrepondo no carro anterior). Isso faz sentido? Ou se eu deixar de usar matriz para usar um ArrayList não seria necessário?

int estoque = Integer.parseInt(JOptionPane.showInputDialog("Informe quantos carros tem no estoque atualmente: "));
        String[][] matriz = new String[estoque][9];
        JOptionPane.showMessageDialog(null, "Existe" + estoque + " carros no estoque. Aperte enter para acrescentar um novo carro.");

        int soma = 0;
               
        soma = estoque + 1;
        
        for (int i = 0; i < soma; i++) {
            marca = JOptionPane.showInputDialog("Digite a marca do carro: ");

Mas sim, eu acho que não precisa ser matriz. Na verdade estou com dúvida nisso. Inicialmente pensei que fosse matriz, já que são várias informações sobre os veículos, mas parece que usar uma ArrayList seria melhor. Só que estou tendo dificuldades em entender como aplicar ela nesse código, pra tirar a matriz e deixar ela.

A classe Carro já está criada! Eu só não entendi o porquê de colocar o [estoque]. Poderia me explicar, por favor?

Desculpe as mil perguntas. To me achando ainda. rs

1 curtida

@staroski

Não preciso usar matriz de String! Na verdade acabei usando isso porque foi o único jeito que tinha achado de fazer a matriz pegar todas as variáveis haha

Mas pelo que to vendo, matriz nem é a resposta para o meu problema.

Quando você diz alocação dinâmica, seria a ArrayList?

estoque é um int que tem a quantidade de carros. Então new Carro[estoque] cria um array de Carro com tamanho igual a estoque - ou seja, o array terá a quantidade de elementos indicada pela variável estoque.

Assim, o código fica “dinâmico”, pois você cria o array com o tamanho exato que foi indicado. Se você usasse um valor fixo, como por exemplo, new Carro[10], o array teria aquele tamanho específico. Fazendo new Carro[estoque], o tamanho fica de acordo com o que foi digitado e colocado na variável estoque.

Você não tem uma classe Carro com os atributos marca, modelo, combustivel, motor, cambio, estado, valor, ano, placa e documentoEmDia?
Se não tem, deveria criar.

Dá pra fazer com matriz, que é o que você está tentando, mas acho que é um esforço desnecessário.
Você pode usar um vetor de Carro, ou uma coleção de Carro.

Alocação dinâmica é uma forma de alocar espaço sob demanda, num vetor você aloca espaço estaticamente, uma vez criado o vetor, ou a matriz, você não consegue mudar o tamanho dele.

ArrayList é uma implementação de List que é uma coleção do tipo lista e, sim, é uma estrutura de alocação dinâmica, mas eu prefiro utilizar LinkedList, que é a implementação clássica de uma lista encadeada.

1 curtida

Tenho sim!
A classe carro está assim:

public class Carro {

//Atributos
String marca, modelo, tipoComb, estado, placa, cambio, doc, motor, ano, ativo, valor;

public Carro() {
}

public Carro(String marca, String modelo, String tipoComb, String estado, String placa, String cambio, String doc, String motor, String tipo, String numChasi, String ano, String valor) {
    this.marca = marca;
    this.modelo = modelo;
    this.tipoComb = tipoComb;
    this.estado = estado;
    this.placa = placa;
    this.cambio = cambio;
    this.doc = doc;
    this.motor = motor;
    this.valor = valor;
    this.ano = ano;
}
public void checaServico(int servico){

    servico = 0;
    servico = Integer.parseInt(JOptionPane.showInputDialog("Selecione o serviço desejado pelo número. Considere o menu abaixo: \n 1- Cadastro \n 2- Editar \n3-Vender \n4- Excluir \n 5- Histórico"));
           
    switch(servico){
        case 1:
             cadastraCarro(marca, modelo, tipoComb, estado, placa, cambio, doc, motor);
        break;
        
        case 2:
            // servico = editaCarro();
        break;
        
        case 3:
            //servico = excluiCarro();
        break;
        
        case 4:
            //servico = historico();
        break;
        default:
            JOptionPane.showMessageDialog(null, "Digite um serviço valido!");
            //servico = Integer.parseInt(JOptionPane.showInputDialog("Selecione o serviço desejado pelo número. Considere o menu abaixo: \n 1- Cadastro \n 2- Editar \n3-Vender \n4- Excluir \n 5- Histórico"));
    }   
}
public void cadastraCarro(String marca, String modelo, String tipoComb, String estado, String placa, String cambio, String doc, String motor /**int ano**/ /**float valor**/){
    int estoque = Integer.parseInt(JOptionPane.showInputDialog("Informe quantos carros tem no estoque atualmente: "));
    Carro[] carros = new Carro[estoque];
    JOptionPane.showMessageDialog(null, "Existe" + estoque + " carros no estoque. Aperte enter para acrescentar um novo carro.");

    for (int i = 0; i < estoque; i++) {
        marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
        modelo = JOptionPane.showInputDialog("Digite o modelo do carro:");
        tipoComb = JOptionPane.showInputDialog("Digite o tipo de combustível do carro: ");
        motor = JOptionPane.showInputDialog("Digite o motor do carro: ");
        cambio = JOptionPane.showInputDialog("Digite o tipo de câmbio do carro: ");         
        valor = JOptionPane.showInputDialog("Digite o valor");
        ano = JOptionPane.showInputDialog("Digite o ano");
        estado = JOptionPane.showInputDialog("O carro é seminovo? (S/N)");            

        String mensagem = "";            

        if (estado.equalsIgnoreCase("S")) {
            placa = JOptionPane.showInputDialog("Digite a placa: ");
            doc = JOptionPane.showInputDialog("O documento está em dia? (S/N)");                
            mensagem = "Você cadastrou o veículo seminovo com sucesso!";
        } else {
            mensagem = "Você cadastrou o veículo novo com sucesso!";
        }

         JOptionPane.showMessageDialog(null, mensagem + "\nModelo: " + modelo + ".\n Marca: " + marca + ".\nTipo de Combustível: " + tipoComb
        + ". \nAno do Veículo: " + ano + ". \nTipo de motor: " + motor + ". \nTipo de câmbio: " + cambio
        + ". \nValor: R$" + valor + ". \nPlaca: " + placa + ". \nO documento está em dia? " + doc + ".");

E no caso o main ficou dessa forma:

    String nome, senha, novoServico, opt;
    int contador, servico;
    servico = 0;
    contador = 0;
                           
    nome = JOptionPane.showInputDialog("Digite o nome de usuario: ");
    senha = JOptionPane.showInputDialog("Digite a senha: ");
          
    if(nome.equals("admin") && senha.equals("1234")){
        JOptionPane.showMessageDialog(null, "Acesso concedido!");
        Pessoa p = new Pessoa(nome, senha);
        Carro c = new Carro();
        c.checaServico(servico);
        contador = 0;
    }else{
        JOptionPane.showMessageDialog(null, "Acesso negado! \nSenha ou Nome invalidos!");
        System.exit(0);
    }
    while(contador == 0){
       novoServico = JOptionPane.showInputDialog("Deseja realizar um novo serviço? (S/N)");
        if(novoServico.equalsIgnoreCase("S")){
            Carro c = new Carro();
            c.checaServico(servico);
        }else{
            System.exit(0);
        }
        
    }   
}   

Já vou pesquisar sobre isso do LinkedList. Ainda não cheguei a ver sobre isso!
No caso, me sugeriram usar como mandei no código acima, com o:
Carro[] carros = new Carro[estoque];

Rodou direitinho o código, mas queria saber se dessa forma ficou certo?

(Obrigada pela paciência)

Entendi!
Faz sentido mesmo.
Aí no caso, eu criei ele. (coloquei o código na resposta que dei no comentário acima). É possível deletar ou editar uma informação dentro desse array?

1 curtida

Tem algumas coisas que dá pra melhorar.

Pra começar, o construtor padrão de Carro:

public Carro() {
}

Quando você faz new Carro(), está chamando o construtor padrão (sem parâmetros), e aí todos os campos do carro serão null. Mas será que faz sentido criar um carro que não tem marca, modelo, placa, ano, etc? Eu diria que não. Então eu deixaria apenas o outro construtor - o que recebe todos os valores e cria o carro com tudo preenchido.

E a classe Carro só deveria ser responsável por representar um carro. Já o cadastro e a leitura das informações poderia ficar em outro lugar. Você poderia, por exemplo, ter uma classe que representa o estoque de carros:

import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class Estoque {
    private List<Carro> carros; // usando List em vez do array
    public Estoque() {
        this.carros = new ArrayList<>();
    }

    public void cadastrar() {
        String marca = JOptionPane.showInputDialog("Digite a marca do carro: ");
        String modelo = JOptionPane.showInputDialog("Digite o modelo do carro:");
        String tipoComb = JOptionPane.showInputDialog("Digite o tipo de combustível do carro: ");
        String motor = JOptionPane.showInputDialog("Digite o motor do carro: ");
        String cambio = JOptionPane.showInputDialog("Digite o tipo de câmbio do carro: ");
        String estado = JOptionPane.showInputDialog("O carro é seminovo? (S/N)");
        String valor = JOptionPane.showInputDialog("Digite o valor");
        String ano = JOptionPane.showInputDialog("Digite o ano");
        String placa = JOptionPane.showInputDialog("Digite a placa: ");
        String doc = JOptionPane.showInputDialog("O documento está em dia? (S/N)");

        Carro novoCarro = new Carro(marca, modelo, tipoComb, estado, placa, cambio, doc, motor, ano, "1", valor);
        this.carros.add(novoCarro); // adiciona o carro no estoque
        JOptionPane.showMessageDialog(null, "Carro cadastrado com sucesso. Informações: \n" + novoCarro);
    }
}

E para que o carro seja impresso corretamente no showMessageDialog, basta sobrescrever o método toString:

public class Carro {
    // campos, construtores, etc

    @Override
    public String toString() {
        return "Carro [marca=" + marca + ", modelo=" + modelo + ", tipoComb=" + tipoComb + ", estado=" + estado + ", placa=" + placa + ", cambio=" + cambio
                        + ", doc=" + doc + ", motor=" + motor + ", ano=" + ano + ", ativo=" + ativo + ", valor=" + valor + "]";
    }
}

E no main, basta usar o Estoque:

public static void main(String[] args) {
    Estoque estoque = new Estoque(); // cria o estoque
    while (true) {
        int servico = Integer.parseInt(JOptionPane.showInputDialog("Selecione o serviço desejado pelo número. Considere o menu abaixo: \n 1- Cadastro \n 2- Editar \n3-Vender \n4- Excluir \n 5- Histórico"));
        switch (servico) {
            case 1:
                estoque.cadastrar();
                break;
            case 2:
                //estoque.editaCarro(); <-- criar este método no Estoque
                break;
            case 3:
                // estoque.excluiCarro(); <-- criar este método no Estoque
                break;
            case 4:
                // estoque.historico(); <-- criar este método no Estoque
                break;
            default:
                JOptionPane.showMessageDialog(null, "Serviço inválido!");
        }
        String opcao = JOptionPane.showInputDialog("Deseja realizar um novo serviço? (S/N)");
        if (opcao.equalsIgnoreCase("N")) {
            break; // sai do while
        }
    }
}

Vale mencionar também que nem todos os campos do carro deveriam ser strings (como o valor e campo ativo), mas aí já são outros detalhes. Primeiro eu arrumaria a estrutura geral - claro que tem várias formas de fazer (talvez o cadastro devesse só receber as informações, e a leitura destes ficaria separada, etc), mas acho que já dá para você brincar um pouco com o que tem aí :slight_smile:

Também usei List para mostrar como ficaria. Repare que você não precisa informar o tamanho, pois internamente ele vai alocando espaço conforme necessário. Já um array tem tamanho fixo e para mudar você teria que criar outro array maior e copiar os valores do anterior, etc. Usando listas fica inclusive mais fácil remover e alterar - e para isso eu sugiro que leia o tutorial de collections, que é um bom ponto de partida.

1 curtida

@hugokotsubo

Acho que fica bem mais claro mesmo criar a classe para o estoque e deixar os métodos lá.

Eu não estava conseguindo deixar os campos do carro como valor e ativo como outra coisa que não String por conta da matriz, mas agora já consegui arrumar!

Além de aparecer todos os dados cadastrados do carro, teria como eu conseguir exibir todos os que foram acrescentados no estoque? Por exemplo, tentei usar um novo método:

public int numeroEstoque(){
return carros.size();
}

Seria correto isso? Pois queria que em certo momento a pessoa pudesse ver tudo que está no estoque para decidir qual quer editar.

Vou ler o tutorial que você indicou e dar uma explorada nesse código! Muito obrigada, já foi uma super luz! =)

Do jeito que está, esse método não faz sentido.
Ele recebe os parâmetros para criar um carro, mas ele usa um JOPtionPane pra reatribuir valor nesses parâmetros?

carros.size() retorna o tamanho da lista. No caso, você teria então a quantidade de carros que tem no estoque.

Se quer mostrar os carros, aí teria que fazer algo como:

// dentro da classe Estoque
public void mostrarCarros() {
    for (Carro carro: this.carros) {
        // aqui mostra o carro (seja com JOptionPane ou com seja lá o que for)
    }
}
1 curtida

@Samy lembre depois, se quiser aperfeiçoar o código dentro da questão de boas práticas de programação, de colocar as variáveis como “private” e usar getters e setters se necessário.

E, no futuro, lembre sempre que interagir com o usuário de colocar a entrada de dados dentro de um bloco try/catch, por segurança. Nunca confie no usuário. rs rs

1 curtida

Consegui organizar essa parte com a ajuda que vocês deram aqui!

Agora vou caminhar com o projeto, próximo passo são os métodos de editar e excluir, mas vou tentar caminhar um pouco por conta própria pra ver se consigo. :smile:

2 curtidas

Obrigada pelas dicas.

Quero ver se consigo acrescentar o “private” sim!

O bloco try/catch eu ainda não ouvi falar, mas é interessante saber que tem. Vou pesquisar sobre isso!

1 curtida

Samy, oi. Vamos lá

Essa questão dos modificadores de visibilidade é importante conhecer. Eles fazem parte de um dos pilares da orientação a objetos, que é o encapsulamento.

Existem quatro:

  1. public: acesso irrestrito aos dados da classe (não recomendado para variáveis, mas sim para algumas funções)
  2. private: só a classe tem acesso a tais variáveis
  3. protected: classe e subclasses têm acesso
  4. sem modificador (package private): a própria classe e outras do mesmo pacote têm acesso

Uma lida rápida no assunto vai esclarecer o que precisa saber. É moleza.

O bloco try/catch é para tratamento de erros. Vou te dar um exemplo simples: você cria uma variável inteira (int i) e pede ao usuário para digitar um valor. O abençoado digita um valor com decimal ou uma letra… o que acontece? Teu programa dá erro porque a entrada é diferente do tipo de dado que você quer coletar.

Isso gera uma exceção, e você precisa tratar essa exceção, senão o programa simplesmente interrompe.

O formato é mais ou menos esse:

try {
	// aqui vão os comandos que o sistema tem que fazer
} catch (Exception erro) { // aqui a identificação do erro, existem vários tipos
	System.out.println(erro); // aqui mostra qual o erro
        // aqui vão os comandos caso der erro
} finally {
       // e aqui vão os comandos que vão ser executados de qualquer forma, dando erro ou não
}

Existe também uma hierarquia das exceções, mas não vou detalhar agora.

Qualquer dúvida, pode enviar!

Bons estudos!

@Fefo80 Oi! Obrigada pela paciência em explicar.

Essa parte do encapsulamento que você comentou descobri que vou ver hoje na aula! Então já deve esclarecer bem :slightly_smiling_face:

Uma dúvida: no caso do código que fiz até agora, você acha que teria necessidade de acrescentar herança entre as classes? Facilitaria? Fiquei na dúvida se faria sentido colocar a classe Estoque como pai.

Isso do try/catch é muito útil mesmo. Vou ver se consigo aplicar ainda nesse projeto (como o prazo tá meio apertado e esse é o meu primeiro projeto usando Java, to perdida e demorando bem mais do que imaginava hahaha)

No momento minha dúvida está sendo como editar uma informação específica do carro dentro da arrayList, pois eu já consegui deixar o código de cadastro ok. Ai como está mostrando todos os carros da lista, eu acrescentei um id pra cada.
Ai no código abaixo, minha ideia era mostrar todos os carros do estoque, e solicitar o id pra pessoa. Mas não estou entendendo como a partir do id eu poderia acessar as informações todas daquele carro específico e então editar.

  public void editaCarro(){
        JOptionPane.showMessageDialog(null, "O estoque consiste em: \n" + this.carros);
        int id = Integer.parseInt(JOptionPane.showInputDialog("Informe o id do veículo que deseja excluir: "));
        carros.get(id);
        carros.indexOf(id);
        String decisao = JOptionPane.showInputDialog("Deseja mesmo editar o veículo? Todas as informações serão deletadas do estoque e você deverá inserí-las novamente. (S/N");
        if (decisao.equalsIgnoreCase("S")){
          
    }
}
}

Você só usa herança quando a classe filha é uma especialização da classe pai.

Toda vez que tiver dúvida se faz sentido estender uma classe, faça a seguinte pergunta:

Um(a) <pretendente à classe filha> é um(a) <pretendente à classe pai>?

Por exemplo:

Um Carro é um Estoque?

No mundo real, faz sentido um carro ser um estoque?

Se fizer, então pode estender,

Senão, não estenda pois estará gerando herança e acoplamento forte desnecessariamente.

2 curtidas

Nossa, isso faz muito sentido. Agora entendi!
Realmente, não faz sentido então nesse caso estender ela.