Duvida sobre exception

Pessoal sou novo em java
tenho uma classe abstrata do tipo Veiculo com os atributos e com os gets e sets, uma classe tipo Carro que apenas herda os campos de Veiculo e uma classe DBTeste que tem um metodo de pesquisa chamando o get.placa(placaAPesquisar) passando uma placa informada

for (int v = 0 ;v < vCarro.length;v++) { 
                 if(vCarro[v].getPlaca().equalsIgnoreCase(pesquisa)){
               System.out.println("localizada");
   }
}

e preciso criar um try catch para lançar uma exceção ( eu tenho uma classe de exceção VeicException e um metodo pesquisaPlaca

 public void pesquisaPlaca(){
          System.out.println("\n   Esta Placa  Não foi localizada");
    }

como eu crio esta exceção ? o lançar ( throw new VeicException) eu crio na classe Veiculo ?

e faço o try catch onde eu tinha um if ?

try(vCarro[v].getPlaca().equalsIgnoreCase(pesquisa)){ ...

e caso eu tenha que lançar na classe Veiculo qual tipo de validação eu faria no getPlaca ?
Se puderem ajudar agradeço

Primeiramente, sem nenhuma ironia, sugiro que vc leia algum tutorial sobre exceções - por exemplo, este aqui, que é bem básico e completo.

Lá tem inclusive capítulos sobre como lançar e capturar uma exceção. Basicamente, para lançar, basta usar throw, não esquecendo de declarar que o método pode lançá-la:

public void fazAlgo() throws AlgoException {
    if (condicao) {
        throw new AlgoException();
    }
    // ... restante do código
}

E ao chamar o método, vc usa um try/catch para capturar a exceção:

try {
    fazAlgo();
    // se chegou aqui é porque não lançou a exceção
    // ... restante do código
} catch(AlgoException e) {
    // se caiu aqui, é porque a exceção foi lançada
}

Dito isso, usar exceções nem sempre é a melhor opção. Por exemplo, o seu método que busca a placa poderia retornar se a placa foi ou não encontrada:

public boolean pesquisaPlaca() {
    boolean encontrouPlaca;
    for (int v = 0; v < vCarro.length; v++) {
        if (vCarro[v].getPlaca().equalsIgnoreCase(pesquisa)) {
            // encontrou, retorna true
            return true;
        }
    }
    // se chegou aqui é porque não encontrou, então retorna false
    return false;
}

Assim, ao chamar o método, basta verificar se encontrou:

if (pesquisaPlaca()) {
    // encontrou, continua o código
} else {
    // não encontrou, mostra mensagem de erro, etc
}

Ou ainda, o método retorna o veículo que tem a placa, ou null se não encontrar:

public Veiculo pesquisaPlaca() {
    for (int v = 0; v < vCarro.length; v++) { 
        if (vCarro[v].getPlaca().equalsIgnoreCase(pesquisa)) {
            // encontrou, retorna o carro
            return vCarro[v];
        }
    }
    // se chegou aqui é porque não encontrou, então retorna null
    return null;
}

Assim, ao chamar o método, basta verificar se o carro não é nulo:

Veiculo veiculo = pesquisaPlaca();
if (veiculo != null) {
    // encontrou, continua o código
} else {
    // não encontrou, mostra mensagem de erro, etc
}

E aproveitando, vc também poderia usar o enhanced for:

public Veiculo pesquisaPlaca() {
    for (Veiculo veiculo : vCarro) { 
        if (veiculo.getPlaca().equalsIgnoreCase(pesquisa)) {
            // encontrou, retorna o carro
            return veiculo;
        }
    }
    // se chegou aqui é porque não encontrou, então retorna null
    return null;
}

Claro que sem mais detalhes do seu projeto (requisitos, etc) não dá pra cravar o que é melhor. Mas em geral, exceções são custosas e eu prefiro usar para situações realmente excepcionais. Uma placa não ser encontrada parece estar dentro da regra de negócio (inferência minha), e pra mim faz mais sentido o próprio método que busca retornar se encontrou ou não, em vez de lançar exceção.

1 curtida

Você pode criar e lançar a exceção personalizada VeicException de uma forma mais organizada ao centralizar a lógica na classe DBTeste e usar o try-catch no método de pesquisa. De forma mais simples não é necessário lançar a exceção diretamente na classe Veiculo, a menos que você queira validar a placa diretamente no método getPlaca() … o que não parece necessário neste caso, mais de pra te passar um conselho pra um iniciante em java, tenta simplificar ou máximo seus códigos, modularizando(dividindo as tarefas em funções menores)
e diminuindo a dependência de uma classe da outra(o que chamamos de acoplamento), espero ter ajudado, abraços.