Por que exceção não é capturada?

Pessoal, por favor, será que alguém sabe me dizer porque o erro da query não é capturado pelo catch?, simplesmente executa normalmente, mas nada é gravado no banco de dados quando há um erro.

public void incluir(Produtos produtos) {

try{
String sql = "insert into " +
"[color=blue]produtos,[/color] " + <-- coloquei essa vírgula de propósito, mas o esse erro não é tratado, não deveria ir para o catch(SQLException e)? "
(codigo, " +
"descricao, " +
"preco, " +
"status) " +
“values(?,?,?,?)”;
PreparedStatement stmt = this.connection.prepareStatement(sql);
stmt.setInt(1, produtos.getCodigo());
stmt.setString(2, produtos.getDescricao());
stmt.setDouble(3, produtos.getPreco());
stmt.setString(4, produtos.getStatus());
stmt.execute();
stmt.close();
}catch(SQLException e){ [color=red]<-- não entra aqui. [/color]}
}

Resumindo, se há um erro na query não deveria entrar no catch? Por favor, me digam o que está de errado e como devo consertar. Obrigado.

Esse seu codigo deu erro? Se deu, mostre o erro.

Coloca dentro do seu SQLException assim:

e.printStackTrace();

Eu fiz o teste na minha máquina e a exceção foi capturada.
Teste ver se não tem classes desatualizadas no class path ou jar …
Limpa tudo e tenta novamente.

Olá,

Tente executar esse SQL errado diretamente no banco de dados para ver no que dá.

Pessoal, responderei na ordem em que foram postadas as respostas:
francislon, não apareceu nenhum erro, simplesmente executa como se nada tivesse acontecido e não aparece nenhum erro, mas não grava no banco.

Ratao, eu coloquei a linha e.printStackTrace(); dentro do bloco catch, como está abaixo:
}catch(SQLException e){
e.printStackTrace();
}

Aparece o erro no console, duplicidade de chave, erro na query ou seja qual for, mas o problema é que entra no bloco try, e não deveria entrar, correto? Deveria ir direto para o bloco catch e apresentar o erro.
Na pag. jsp em que chamo método de inclusão, é executado normalmente e mostra a mensagem de “inclusão realizada com sucesso”, o que não ocorreu.

jgbarros, vc executou esse método que postei e não entrou no try e foi direto pro catch? Como eu vejo se tem classes desatualizadas no classpath ou jar? Me explique, por favor. Mas de qualquer maneira acho que todas as classes estão corretas.

furutani, executando a query direto no banco dá erro sim.

Aproveitando, se puderem me mostrar como faço o código para que me mostre na pág. jsp que houve um erro, algo do tipo, “Duplicidade de chave” ou “Há um erro na query”, ou seja, mostrar uma mensagem de erro na pág. informando qual tipo de erro houve, mas que não mostra aquele erro do tipo “HTTP STATUS…”, deve continuar na página onde o usuário tem a opção de executar de novo, fechá-la, clicar em um link que por acaso exista na página, etc.

Agradeço a ajuda, fico aguardando.

Ok rdgc, o código jsp está abaixo, como eu devo fazer para apresentar uma mensagem de erro na tela quando quando este ocorrer?

Cadastra Produtos
		</table>
	</form>
	
	[color=red]<%
		if(request.getParameter("incluir") != null){
			ProdutosDao dao = new ProdutosDao();
			dao.incluir(prod);
			out.println("Inclusao realizada com sucesso!!!!");
		}
	%>[/color]	
</body>
Código:
Descrição:
Preço:
Status:

Se alguem me perguntasse apenas isso (o titulo) eu diria:

Bom, se vc fez um try/catch(Exception xxx), parece que a exceção lançada não é filha da classe Exception.

Se não é filha de Exception, ou é um Erro ou algo que extende Throwable.

Agora, eu suponho pela sua pergunta que alguma exception é lançada dentro desse try/catch. Vc enfrenta o contrario: nenhuma exception é lançada.

Lançar uma exception ou não é uma decisão de design.

Ex: eu posso ter um método de busca de usuarios em um banco de dados pelo login do mesmo. Se eu nao encontro eu posso ou lançar uma exception ou retornar null. É uma opção de design. Para tratar as exception vc tem que compreender quais são e quando são lançadas.

O que acontece nesse caso deve ser que nenhuma exception é lançada mas eu iria verificar o resultado do método execute.

peczenyj, fiquei meio confuso com sua explicação, claro que algumas exceptions são decisão de design ou regras de negócio, acho que foi isso que vc quis dizer. Se em uma busca de login em um banco não encontrar quem procuro, posso tratar esse caso de várias maneira, num if, por exemplo.
Mas nesse meu problema o que quero entender é o que fiz de errado pra que não entre no catch quando a query tiver uma vírgula errada, por exemplo, ou qualquer outro erro de sql.
Espero não ter feito mais confusão, mas estou tentando aprender java na raça.

Pelo que eu percebi do seu bloco try/catch, no primeiro exemplo estava sendo executado mas silenciosamente pois você não colocou nenhum tratamento. A prova disso foi que quando colocou o e.printStackTrace() as mensagens começaram a aparecer no console.
Quanto ao aparecimento da mensagem de sucesso, ao tratar uma exceção, se não tiver nada que faça o código parar (até mesmo relançando a Exception), ele vai continuar o fluxo normal.

Isso mesmo khaoz, mas não estou sabendo fazer essa parte de parar a execução quando ocorre o erro e mostrar na página.

Algo como:

try {
    // lalalalala
} catch (SQLException se) {
    System.out.prinln("HÁ!!!"); // o objetivo do HÁ e tentar entortar uma colher XD
    throw se;
}

[quote=Winthorp]Pessoal, responderei na ordem em que foram postadas as respostas:
francislon, não apareceu nenhum erro, simplesmente executa como se nada tivesse acontecido e não aparece nenhum erro, mas não grava no banco.

Ratao, eu coloquei a linha e.printStackTrace(); dentro do bloco catch, como está abaixo:
}catch(SQLException e){
e.printStackTrace();
}

Aparece o erro no console, duplicidade de chave, erro na query ou seja qual for, mas o problema é que entra no bloco try, e não deveria entrar, correto? Deveria ir direto para o bloco catch e apresentar o erro.
Na pag. jsp em que chamo método de inclusão, é executado normalmente e mostra a mensagem de “inclusão realizada com sucesso”, o que não ocorreu.
[/quote]

Quando vc trata exceções com Try/Catch, as linhas do try são executadas e se, em alguma delas ocorrer algum problema, o bloco catch é chamado para o tratamento do erro ser efetuado. Por isso que em seu teste, ele acessou o bloco try e quando ocorreu a exceção, foi impresso o erro no console.

Seu jsp apresentou mensagem de sucesso porque, provavelmente, vc está retornando uma mensagem independente se foi executado com sucesso ou não. Verifique seu código e poste aqui se tiver dúvida.

Flws!

[quote=Winthorp]Ok rdgc, o código jsp está abaixo, como eu devo fazer para apresentar uma mensagem de erro na tela quando quando este ocorrer?

[code]


Cadastra Produtos


<jsp:useBean id=“prod” class=“classes.Produtos”></jsp:useBean>
<jsp:setProperty name=“prod” property="*"/>







		</table>
	</form>
	
	[color=red]<%
		if(request.getParameter("incluir") != null){
			ProdutosDao dao = new ProdutosDao();
			dao.incluir(prod);
			out.println("Inclusao realizada com sucesso!!!!");
		}
	%>[/color]	
</body>
[/code][/quote]

Estou um pouco sem tempo p/ colocar o código…

Aqui tem a resposta:

http://www.caelum.com.br/caelum/apostila/caelum-java-web-fj21.pdf

Código:
Descrição:
Preço:
Status: