Questão de fluxo de controle - Possível falha livro kathy sierra!

7 respostas
faelcavalcanti

Fala pessoal, estou martelando quanto a uma questão do livro de kathy voltado para o exame (310-055). Para quem possui o livro é a questão 15 da página 397, para os que não possui segue abaixo o seu enunciado:

Given:
class Mineral { }
    class Gem extends Mineral { }

    class Miner {

        static int x = 7;
        static String s = null;
        
        public static void getWeight(Mineral m) {
            int y = 0 / x;
            System.out.print(s + " ");
        }
        
        public static void main(String[] args) {
            Mineral[] ma = {new Mineral(), new Gem()};
            for(Object o : ma)
                getWeight((Mineral) o);
            }
        }
    }
And the command-line invocation: java Miner.java What is the result?

A. null
B. null null
C. A ClassCastException is thrown.
D. A NullPointerException is thrown.
E. A NoClassDefFoundError is thrown.
F. An ArithmeticException is thrown.
G. An IllegalArgumentException is thrown.
H. An ArrayIndexOutOfBoundsException is thrown.

Adivinhem, mas a resposta é a letra E, e por mais incrível que pareça.
Se vocês colocarem para rodar este código, verão que não acontecerá nenhuma exceção ou erro conforme resposta certa.

De certa forma estou indignado com a resposta, pois não consegui simular esta situação. Fiquei pensando depois, será que porque como estou utilizando o eclipse, de alguma forma posso estar fazendo algo errado.

Efetuei a seguinte modificação e mesmo assim o resultado é o mesmo. Vejam:

package teste;

class Mineral { }
class Gem extends Mineral { }

public class Miner {
	
	static int x = 7;
	static String s = null;
	
	public static void getWeight(Mineral m) {
		int y = 0 / x;
		System.out.print(s + " ");
	}

	public static void main(String[] args) {
		
		try {
		
			Mineral[] ma = {new Mineral(), new Gem()};
			for(Object o : ma)
				getWeight((Mineral) o);
			
		} catch (Throwable e) {
			System.out.println( "bomba" );
		}
		
	}
}

:?

7 Respostas

Mauricio_Linhares

Você deu o comando no código e ele funcionou? Tem certeza?

Porque faltou definir o classpath na linha de comando.

faelcavalcanti

Maurício Linhares:
Você deu o comando no código e ele funcionou? Tem certeza?

Porque faltou definir o classpath na linha de comando.

Não tenho certeza, mas como faço este procedimento utilizando o eclipse ?

Também andei efetuando uma vistoria sobre possíveis erratas quanto ao livro mas mesmo assim não corresponde, tampouco algum comentário.

Segue abaixo as erratas mediadas por Bert Bates.

Mauricio_Linhares

Veja que ele manda executar “java Miner.java”, ele nem compilou ainda e mandou a JVM executar o arquivo texto com o código fonte.

faelcavalcanti

Poxa cara, que mancada feia eu dei.

Nem prestei atenção a isto. Valeu mesmo Maurício, vou ficar de olhos mais atentos a pequenos detalhes.

:shock:

T

Já vi no Bug Database uma solicitação para que as seguintes coisas:

java Miner.java

e

javac Miner

fossem “toleradas”. No primeiro caso, ao pé da letra estaríamos solicitando a execução da classe “java” do package “Miner”; e no segundo caso, ao pé da letra estaríamos solicitando que o arquivo “Miner” (não Miner.java) fosse compilado.
O iniciante em Java acha que no primeiro caso ele estaria tentando rodar a classe Miner, e no segundo tentando compilar o arquivo Miner.java.
Acho que o próprio pessoal da Sun andou tentando mexer no javac.exe e no java.exe para permitir isso (a alteração é estupidamente simples), mas no fim das contas acabaram voltando atrás. (Acho que voltaram atrás para que os professores de Java pudessem pegar no pé sobre essas coisas bobocas :stuck_out_tongue: )

faelcavalcanti

O mesmo ocorreu com a inclusão do método printf, talvez para que deixassem os programadores antigos de “C” mais felizes.

T

Não se esqueça que o sr. James Gosling (o criador do Java) também é um antigo programador C :stuck_out_tongue:

Criado 21 de agosto de 2006
Ultima resposta 21 de ago. de 2006
Respostas 7
Participantes 3