O ViniGodoy me disponibilizou o metodo abaixo para ler um bytebuffer. Ma a minha dúvida é quando ou em que situações é aconselhável eu utilizar
throws *Exception e utilizar try +catch.
pois se eu colocar um try catch no código abaixo quando meu programa se encera o processamento da máquina vai a 100% e quando volto a utilizar throws IOException o programa executa normalmente.
Alguém teria algum documento explicando de quando utilizar try catch e throws IOException???
# private ByteBuffer blockRead(int bytes) throws IOException {
# ByteBuffer msg = ByteBuffer.allocate(bytes);
# int readBytes = 0;
# while (readBytes < bytes) {
# int readCount = clientChannel.read(msg);
# if (readCount == -1) {
# System.out.println("FECHEI CONEXAO");
# clientChannel.close();
# }
# readBytes += readCount;
# }
# msg.flip();
#
# return msg;
# }
Olá spiderman,
Bem sua questão está em torno da regra do que chamamos de handel or declare.
na verdade essa operação de leitura de bytes é caracterizada como de risco, por isso ela lança uma exception do tipo IOException (Exception verificada).
Sendo assim vc é obrigado a declarar na assinatura do método que vc vai lançar essa Exception( passar a vez para quem chamou esse método) ou tratar a exception utilizando um bloco try catch.
Eu prefiro tratar a exception pois mais cedo ou mais tarde vc vai ter que capturar mesmo a exception ou seu programa pode fechar, causando um transtorno ao usuario.
Nesse caso utilize um bloco try catch:
[code]
# private ByteBuffer blockRead(int bytes){
# ByteBuffer msg = ByteBuffer.allocate(bytes);
# int readBytes = 0;
# while (readBytes < bytes) {
try{
# int readCount = clientChannel.read(msg);
# readBytes += readCount;
if (readCount == -1) ;
} catch(IOException e){
# System.out.println(“OOps!! lançou IOException!”);
# } finally{
# System.out.println(“FECHEI CONEXAO”);
# clientChannel.close();
# }
# msg.flip();
# return msg;
# } [/code]
A regra é sempre capturar as exceptions verificadas antes que cause um dano maior no sistema.
Quanto mais específica for o tipo da exception capturada, melhor fica sua aplicação, e menos recursos são utilizados pelo seu sistema.
Meu ponto de vista é esse, espero que sirva de ajuda.
Abraço
É longo, mas vale a pena ler:
http://blog.caelum.com.br/2006/10/07/lidando-com-exceptions/
Mas você tem que pensar assim. Se uma exception de I/O for disparada no meio do blockread, o que significa? Provalmente que o socket fechou, e que o canal não está mais disponível.
O blockread roda num loop. Uma exception dessa deveria parar o loop. Se você põe um try catch aí dentro, o seu loop vai tentar o tempo ler um canal indisponível, e vai ficar ininterruptamente procurando por um dado que nunca mais chegará lá. O canal avisa isso por uma exception, mas seu try catch a captura e ignora, o que faz a leitura ocorrer novamente.
E isso explica os tais 100% de CPU.