Pq a compilação Falha?

Question 224
Given:
42. public class ClassA {
43. public int getValue() {
44.int value=0;
45. boolean setting = true;
46. String title=?Hello?;
47. if (value || (setting && title == ?Hello?)) { return 1; }
48. if (value == 1 & title.equals(?Hello?)) { return 2; }
49. }
50. }
And:
70. ClassA a = new ClassA();
71. a.getValue();
What is the result?
A. 1
B. 2
C. Compilation fails.
D. The code runs with no output.
E. An exception is thrown at runtime.
Answer: C

O problema está aqui:

if (value || (setting && title == ?Hello?)) { return 1; } 

Não podemos fazer comparacoes entre valores inteiros (value) e tipos booleanos…

A linha 48 compila normalmente, considerando que o simbolo ? seja aspas, acredito que foi erro de digitacao…

Abracos

Além do que o scarton falou acho que o método também pede o return…
Porque, mesmo após conserta o if, se nenhum deles for satisfeito o metodo não ira retornar nada, e isso nao pode acontecer!

Tem vários erros de compilação:

  • Interrogação no lugar de aspas.
  • Primeiro if comparando int com boolean
  • Segundo if com & onde deveria ser &&
  • método getValue() não retorna um int fora dos 2 if´s

[quote=ataufo]…

  • Segundo if com & onde deveria ser &&
    …[/quote]
    Isso não é erro. O operador binário “E” é ‘&’. ‘&&’ é um operador binário de curto-circuito, assim como “OU” é ‘|’ e o curto-circuito dele é ‘||’.

Até!

[quote=maquiavelbona][quote=ataufo]…

  • Segundo if com & onde deveria ser &&
    …[/quote]
    Isso não é erro. O operador binário “E” é ‘&’. ‘&&’ é um operador binário de curto-circuito, assim como “OU” é ‘|’ e o curto-circuito dele é ‘||’.

Até![/quote]
Entretanto o operador binário & não deve ser usado para comparar valores que não sejam bits. Isso é tido como erro de programação.

Onde viste isso? Se eu precisar que ambas as condições sejam avaliadas isso é considerado um erro de programação?
Se você falar que é feio, podemos discutir longamente, mas falar que é errado usar tem que ter mais argumentos.

Até!

Olha realmente não sei ainda a diferença de & e &&. Mas que tipo de valores não seriam bits ?

Ada é bem mais verbosa que o Java nesse ponto, mas é mais intuitiva.

// Java
if (x & y) {
   ...
}
// Ada
if x and y then 
   ...
end if;
// Java
if (x && y) {
   ...
}
// Ada
if x and then y then
    ...
end if;

Olha realmente não sei ainda a diferença de & e &&. Mas que tipo de valores não seriam bits ?[/quote]

A diferença é que o & verifica as duas condições, por exemplo vc tem:

if(x>0 & x<2)

Será verificado se x é maior que zero, mesmo ele sendo maior ou menor que zero, também será verifcado se x é menor que 2.

Caso a expressão fosse:

if(x>0 && x<2)

Se ao verificar se X é maior que zero o X NÃO fose maior que zer, então ele NEM ia verificar se x é menor que 2.

Essa é a diferença, o & compara os dois de quaquer jeito, já o && só compara o outro se o primeiro for verdadeiro.

Abraço

[quote=maquiavelbona]Onde viste isso? Se eu precisar que ambas as condições sejam avaliadas isso é considerado um erro de programação?
Se você falar que é feio, podemos discutir longamente, mas falar que é errado usar tem que ter mais argumentos.

Até![/quote]
Me expressei mal. Esses operadores são usados APENAS nos casos em que você quer obter um resultado específico, como por exemplo o que você citou. Se eu quero comparar um inteiro com outro (E, OU, etc) eu devo utilizar os operadores de curto-circuito, e aí sim utilizar operador binário é um erro de programação.

[quote]Essa é a diferença, o & compara os dois de quaquer jeito, já o && só compara o outro se o primeiro for verdadeiro.
[/quote]

Entendi. Obrigado.