throwsIOException + tryCatch

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.