Analise o código C# exibido a seguir.using System; namespac...
Analise o código C# exibido a seguir.
using System;
namespace ErrorHandlingApplication {
class DivNumbers {
int result;
DivNumbers() {
result = 0;
}
public void division(int num1, int num2) {
try {
result = num1 / num2;
}
catch (SystemException e) {
Console.WriteLine
(e.ToString().Split(':')[0]);
} finally {
Console.WriteLine
("Resultado: {0}", result);
}
}
static void Main(string[] args) {
DivNumbers d = new DivNumbers();
d.division(24, 2 >> 1);
}
}
}
Assinale a opção que exibe o resultado da execução desse código.
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
Alternativa Correta: C - Resultado: 24
Para resolver esta questão, é necessário compreender como o código C# executa a divisão de números, como funciona o mecanismo de tratamento de exceções com try-catch-finally e a operação de shift à direita (>>
) em C#.
No código dado, temos a classe DivNumbers que possui um método chamado division para dividir dois números inteiros. O tratamento de exceções é feito envolvendo o código que pode lançar uma exceção em um bloco try, seguido por um bloco catch que captura a exceção e finalmente um bloco finally que será executado independentemente do resultado da tentativa de divisão.
O interessante aqui é o uso do operador de deslocamento à direita (>>
) no argumento que chama o método division. O número 2 >> 1
é uma operação de shift onde o número 2 (binário 10) é deslocado 1 bit para a direita, resultando no número 1 (binário 1). Portanto, a expressão d.division(24, 2 >> 1)
efetivamente executa a operação d.division(24, 1)
.
Quando a divisão é realizada dentro do bloco try, num1
é 24 e num2
é 1, resultando em result
sendo igual a 24, já que 24 dividido por 1 é 24. Não há exceção lançada, portanto, passamos diretamente para o bloco finally, que imprime o valor de result
. Por isso, o resultado impresso é "Resultado: 24".
O bloco catch não é acionado porque não ocorreu uma exceção do tipo SystemException (ou qualquer outra exceção) durante a divisão. Se houvesse uma divisão por zero, por exemplo, uma System.DivideByZeroException seria lançada e o bloco catch capturaria essa exceção, mas neste caso específico, isso não acontece.
Portanto, a alternativa correta é de fato C, onde o resultado é 24, o que é consistente com o funcionamento esperado do código fornecido.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
A questão trata sobre deslocamento de bits à direita (>>). Como pode ser visto na expressão d.divison(24, 2 >> 1).
Traduzindo... Pegue o número 2(010 em binário) e desloque 1 bit a direita ( >> 1). Com isso teremos o número 001 em binário, ou seja, número 1 em decimal.
Com isso passamos para a função os valores num1= 24; e o num2=1;
Efetuando o calculo dentro do bloco try...
result = num1 / num2;
result= 24/1
result=24;
Resultado: 24;
GABARITO LETRA C
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo