Galera peço ajuda a vocês pôs realmente não entendi a função do throws num bloco try , catch ,finally
Se alguempoder me ajudar…
Obrigado desde já…
Galera peço ajuda a vocês pôs realmente não entendi a função do throws num bloco try , catch ,finally
Se alguempoder me ajudar…
Obrigado desde já…
Então gabriel, de certo vc deve ter lido o Use a cabeça Java.
Tentou ler a apostila FJ-11 da Caelum tbm? Ela esclarece bem a sua dúvida.
Não sei se entendi perfeitamente sua dúvida, mas é em relação quando usar throw, throws, try/catch/finally?
Reitero, leia essa apostila, pois pra vc entender isso vai ter que entender oq é Exception, RuntimeException, Throwable…é bom entender bem esses conceitos, mto importante para o programador.
Mas caso tenha qq dúvida, poste de novo que a gente tentar deixar clara essa parte da melhor forma possível.
[]´s
Oba veio tudo bom? também sou de Ramos no Rio de Janeiro sei que você esta com duvidas em relação ao livro da kathy, me add no msn para trocarmos algumas ideias.
oi Gabriel,
acho que depende bem da situação. Talvez no seu tratamento de exceções vc não queira disparar um NaoSeiPatatifasDeNadaOQIssoQuerDizerException, com uma mensagem tão pouco clara quanto o nome.
Talvez vc queira disparar, no lugar dessa exceção que possa ser muito abrangente e pouco clara, uma exceção mais objetiva e clara.
apenas dando uma palinha…
Exception é uma exceção, ou seja, é algo fora da normalidade do seu código… e ela serve para informar a quem invocou um método, ou seja, uma ação, que algo que não é do fluxo normal ocorreu, ou seja, algo não esperado aconteceu, o que incorre em tratamento…
Por exemplo, imagine uma classe Produto, com 2 porpriedades… nome e quantidade…
o fluxo normal quando vc cria um produto, seria dar um nome, e uma quantidade do produto existente…
Pois imagine que o lugar onde vc salva os dados do produto so aceite 40 caracters, e não mais que isso, a forma de avisar pra alguem, quando o código sai do normal, é lançando uma exceção pra cima, ou seja… vc avisa:
"EI! ocorreu um problema, e eu não tenho como resolve-lo, resolva o problema ou passa para alguem que resolva".
o modo de fazer isso programando ? use um throw …
[code]public class Produto {
private nome;
//esse throws avisa que a exceção pode, ou não, ser lançada
public voi setNome(String nome) throws IllegalArgumentoException {
if(nome.length() > 40) //aki eu defino, se for + de 40 caracters, eu lanço a exceção…
throw new IllegalArgumentException(“Não é possivel definir um nome com mais de 40 caracters”);
this.nome = nome;
}
}[/code]
throws (no plural) é um aviso que o método é capaz de lançar exceções…
throw (no singular) define um lançamento de exceção…
agora o pq do Try, Catch, Finally… isso quer dizer
try -> tente isso
catch -> agarre esse erro se houver
finally -> ocorrendo ou não o erro, faça isso
isso quer dizer q vc pode fazer assim programando
public Produto criaProduto(String nome);
Produto produto = new Produto();
try {
produto.setNome(nome);
} catch(IllegalArgumentException ex) {
System.out.println("Voce digitou um nome maior que 40 caracters, digite outro");
produto = criaProduto(scanner.input());
} finally {
scanner.close();
}
return produto;
}
esse exemplo faz assim… ele cria um Produto,
try -> tenta setar o nome enviado no produto…
catch -> caso o nome seja maior que 40 caracters, ou seja, caso ocorra uma exceção, ele chama outro método, que é um scanner para pegar os dados via console… e entre no proprio método, para tentar novamente criar um produto com o nome enviado… e ficara fazendo isso, ate ser digitado um nome valido…
finally -> independete se houver ou não o erro… ao final ele fecha o scanner
…
espero ter ajudado…
Entendi
mais nessa parte
} catch(IllegalArgumentException ex) {
Eu poderia colocar qlqr outracoisaException no lugar de IllegalArgumentException ou esse é o nome do erro qnd estoura?
Abraço e obrigado!!
Podes colocar simplesmente exception (O GENERICO) so que quanto mais generico seu algoritmo mais pesado e lerdo ele fica.
Caso queira uma ajuda:
http://www.javaworld.com/javaworld/jw-07-1998/jw-07-exceptions.html :!:
So que é tudo em inglês, mas o conteudo é muito bom.
Abraço.
[quote=GabrielCardelli]Entendi
mais nessa parte
} catch(IllegalArgumentException ex) {
Eu poderia colocar qlqr outracoisaException no lugar de IllegalArgumentException ou esse é o nome do erro qnd estoura?
Abraço e obrigado!![/quote]
catch, quer dizer segurar… esse é o nome do erro que vc ker segurar…
catch(SQLException ex) por exemplo… vai segurar um erro gerado por acesso a banco de dados…
catch(NullPointerException ex) vai segurar error gerado quando se tenta acessar uma variável e ela é nula…
e assim vai…
saiba o catch é sequencial… e vai agarrar o que tiver escrito portanto algo como
try {
//...
} catch (Exception ex) {
//...
} catch (RuntimeException ex) {
//...
} catch (NullPointerException ex) {
//...
} catch (IllegalArgumentException ex) {
//...
}
no primeiro catch o erro vai parar… e como ta escrito Exception ex… ele vai segurar todas as excetions ali… ou seja… nunca vai sobrar exception pro resto… ja que Exception é superclasse de RuntimeException que é superClasse de NullPointerException e de IllegalArgumentException…
por tanto se uma NullPointerException for gerada… ela não vai descer ate NullPointer… vai parar no 1° … vc precisa colocar antes sempre, a exception menos generica… por exemplo
try {
//...
} catch (NullPointerException ex) {
//...
} catch (IllegalArgumentException ex) {
//...
} catch (RuntimeException ex) {
//...
} catch (Exception ex) {
//...
}
Agora sim… se ocorrer um NullPointer, ele para no 1° catch… se ocorrer um IllegalArgument, que não é subclasse de NullPointer, ele para no 2°
Se ocorrer qualquer RuntimeException que não seja NUllPointer ou IllegalArgument… ele vai parar na 3°
Se ocorrer qualquer Exception que não seja uma RuntimeException ele vai parar no 4° …
…
vc pode ter quantos catch quiser… para segurar as exceções que vc quiser tratar…
Ps.: o bloco finally {} que fica ao final dos catch é opicional, vc usa se quiser
Entendi muito obrigaod gente!!
Pessoal,
É o seguinte estou lendo a FJ-11 da Caelum e realmente é um excelente material para estudo. Em breve prentendo estar agendando um curso na Caelum de São Paulo, pois sou de Salavdor(BA) e tenho que planejar tudo direitinho: passagem, folgas no trabalho, hospedagem, etc…
Bem minha dúvida é o seguinte:
O try/catch está bem claro. Minha dúvida é em relação ao thorws. O throws serve somente para informar a quem for fazer a invocação do metodo que aquele metodo é capaz de ter execessões? É só isso? Qual a real utilidade de usar:
public static void metodo() throws java.io.FileNotException{
Grato pela atenção…
Abraço a todos…
Daniel,
No seu exemplo, o seu método está dizendo o seguinte para quem for chamá-lo:
“…em alguma parte do meu código (no corpo do método) existe a possibilidade de um arquivo não ser encontrado (exceção). Não estou interessado em tratar essa exceção. Por favor, trate-a ou passe para frente.”…
Espero ter ajudado
Beleza Leandro. obrigado cara pela explicação e atenção… mas para se aprofundar mais um pouco no assunto sem querer ser abusado… vamos ao seguinte exemplo:
public class Exemplo {
static int divisao;
public static void main(String args[]){
metodo2();
metodo0();
System.out.println("\n Final do main");
}
public static void metodo0()throws java.lang.ArithmeticException{
divisao = 4/0;
System.out.println(divisao);
System.out.println("\n Teste");
}
public static void metodo1(){
try{
new java.io.FileReader("arquivo.txt");
}catch (java.io.FileNotFoundException e){
System.out.println("Não foi possivel abrir o arquivo!");
}
}
public static void metodo2()throws java.io.FileNotFoundException{
new java.io.FileReader("arquivo.txt");
}
}
Eu percebi o seguinte: Quando eu faço a invocação do metodo2 pelo main, o eclipse acusa erro de manipulação do FileNotFoundException, ótimo! Eu acho que é para isso que o throws serve né? Ou seja, como você disse, jogou a responsabilidade de fazer o tratamento da excessão para que fizer a invocação daquele metodo e alerta a manipulição daquela excessão no momento da invocação. Agora quando eu faço a invocação do metodo0 o eclipse não retorna nenhum erro de manipulação ArithmeticException, ou seja, o throws perdeu o sentido de sua existência, é isso? Tem haver com os conceitos de unchecked e checked? Ou seja, eu não sou obrigado a tratar as excessões neste caso, por isso o throws perde o sentido? Pelo que entendi o throws “me libera” de tratar um excessão obrigatorio naquele momento e passa a bola para quem for usar aquele metodo no momento da invocação. Quando não é obrigatório o throws perde o sentido. É isso?
Desculpe o abuso…
Obrigado pela atenção…
Abraço a todos…
Então Daniel,
Realmente, o ArithmeticException extende RuntimeException, que é “unchecked”, não obrigando portanto o programador a tratar a exceção em tempo de compilação.
Neste caso, FileNotFound extende IO que extende Exception, que por sua vez é “checked”. O Java obriga a tratar as exceções checked (que são do tipo Exception) em tempo de compilação.
Isso não significa que o throws é inútil no seu metodo0().
O throws poderia ser uma “sugestão”, onde quem for chamar o método, poderia tratar a exceção ou não, dependendo da regra do negocio.
Não sei se fui mto claro, mas tem esse post do GUJ que explica legal esse assunto:
Mais claro impossível!!
Muito obrigado mais uma vez pela atenção e presteza nas respostas.
Grande abraço…
Muito Bom. Ótima explicação!
[quote=Lavieri]apenas dando uma palinha…
Exception é uma exceção, ou seja, é algo fora da normalidade do seu código… e ela serve para informar a quem invocou um método, ou seja, uma ação, que algo que não é do fluxo normal ocorreu, ou seja, algo não esperado aconteceu, o que incorre em tratamento…
Por exemplo, imagine uma classe Produto, com 2 porpriedades… nome e quantidade…
o fluxo normal quando vc cria um produto, seria dar um nome, e uma quantidade do produto existente…
Pois imagine que o lugar onde vc salva os dados do produto so aceite 40 caracters, e não mais que isso, a forma de avisar pra alguem, quando o código sai do normal, é lançando uma exceção pra cima, ou seja… vc avisa:
"EI! ocorreu um problema, e eu não tenho como resolve-lo, resolva o problema ou passa para alguem que resolva".
o modo de fazer isso programando ? use um throw …
[code]public class Produto {
private nome;
//esse throws avisa que a exceção pode, ou não, ser lançada
public voi setNome(String nome) throws IllegalArgumentoException {
if(nome.length() > 40) //aki eu defino, se for + de 40 caracters, eu lanço a exceção…
throw new IllegalArgumentException(“Não é possivel definir um nome com mais de 40 caracters”);
this.nome = nome;
}
}[/code]
throws (no plural) é um aviso que o método é capaz de lançar exceções…
throw (no singular) define um lançamento de exceção…
agora o pq do Try, Catch, Finally… isso quer dizer
try -> tente isso
catch -> agarre esse erro se houver
finally -> ocorrendo ou não o erro, faça isso
isso quer dizer q vc pode fazer assim programando
public Produto criaProduto(String nome);
Produto produto = new Produto();
try {
produto.setNome(nome);
} catch(IllegalArgumentException ex) {
System.out.println("Voce digitou um nome maior que 40 caracters, digite outro");
produto = criaProduto(scanner.input());
} finally {
scanner.close();
}
return produto;
}
esse exemplo faz assim… ele cria um Produto,
try -> tenta setar o nome enviado no produto…
catch -> caso o nome seja maior que 40 caracters, ou seja, caso ocorra uma exceção, ele chama outro método, que é um scanner para pegar os dados via console… e entre no proprio método, para tentar novamente criar um produto com o nome enviado… e ficara fazendo isso, ate ser digitado um nome valido…
finally -> independete se houver ou não o erro… ao final ele fecha o scanner
…
espero ter ajudado…[/quote]