Exceções - TestKiller

15 respostas
I

Olhem essa questão:

package questoes;

 public class A {
 public void method1() {
 B b=new B();
 b.method2();
 // algum código aqui
 }
 }
 
 public class B {
 public void method2() {
 C c=new C();
 c.method3();
 // algum código aqui
 }
 }
 
 public class C {
 public void method3() {
 // algum código aqui
 }
 }

//DADO//
 try {
 A a=new A();
a.method1();
 } catch (Exception e) {
 System.out.print("an error occurred");
 }
 
// O que é verdade se uma NullPointerException for lançada na linha 3 da 
// classe C?(Escolha duas opções.)
//
// A. A aplicação vai falhar.
// B. O código na linha 29 será executado.
// C. O código na linha 5 da classe A será executado.-OK
// D. O código na linha 5 da classe B será executado.
// E. A exceção será relançada de volta a linha 27. -OK

eu rodei o programa e não é isso que acontece, o bloco catch é executado, ou seja, resposta B. Estou certo?
ou to falando besteira mesmo e esse testkiller que eu peguei de uma fonte não confiavel ta errado mesmo?
Muito Obrigado

15 Respostas

Diabo_Loiro

cara o testekiller sempre tem erros, acho legal isso pq quando voce começar a pegar os erros do testkiller é que voce ta ficando pronto para fazer a prova.

I

Diabo Loiro, vlw mesmo. O pior é que eu não acho erros só em testes não, até em livros já achei,
da vontade de ligar pra revisão tecnica dos livros chingar todos eles.

muito obrigado

Diabo_Loiro

sempre tem erros.
Quando voce comprar um livro no site da altabooks por exemplo tem parte que tem uma errata, se o erro que voce encontrou não estiver lá envie ele para poupar ou outros usuários deste aborrecimento.

I

Ei achei mais uma estranha:

public class Questao91 {
	 public String makinStrings() {
	 String s = "Fred";
	 s = s + "47";
	 s = s.substring(2, 5);
	 s = s.toUpperCase();
	 return s.toString();
	 }

}

//Quantos objetos String serão criados quando este método for chamado?
//
//		A. 1
//		B. 2
//		C. 3 -OK
//		D. 4
//		E. 5
//		F. 6

Eu dei uma olhada nos hashcodes de cada atribuição feita, e me deu 4 objetos diferentes, sera que eu to certo de novo? ou não?
obrigado

drigo.angelo

Eu acho que são 4 mesmo, respectivamente
“Fred”
“Fred47”
“e7”
“E7”
Como cada String é final, para cada uma foi um objeto diferente… 8)

Andre_Fonseca
drigo.angelo:
Eu acho que são 4 mesmo, respectivamente "Fred" "Fred47" "e7" "E7" Como cada String é final, para cada uma foi um objeto diferente.. 8)
oi,

Isso acontece não porque a String é final, mas porque ela retorna uma nova string na invocação do método

Olha o método substring

public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }
I

Eu acho que seria:

Fred
Fred47
Fred4
FRED4

pessoal por favor, respondam qual alternativa vocês acham que seria a correta
na minha opiniao é 4 objetos String criados, sendo que no TestKiller fala que é 3.

drigo.angelo

Ou seja, Strings são constantes (não necessáriamente final, foi mals :oops: ) ; seus valores não podem ser alterados depois que elas são criadas.

Logo, se temos 4 valores para String:
“Fred”
“Fred47”
“ed47”
“ED47”

Temos 4 objetos String.

Eric_Yuzo

Realmente tem 4 objetos ali, mas a pergunta se refere a quantos são criados no momento que o método é chamado. A primeira linha não cria uma String, apenas pega uma referência do pool.

Vejam a explicação do thingol: http://www.guj.com.br/java/116352-duvida-na-quantidade-de-strings-criadas-resolvido

I

ta muito estranho isso, se na primeira linha, ou seja, na atribuição (String s = “Fred”) fala que pegou essa
literal do pool de Strings, qual a diferença para o codigo na proxima linha (s = s + “47”) sendo que o 47 tambem
vem do pool???

aqui esta a minha versao. O pool só serve para que a JVM economize memória, por exemplo:

public class Teste {
	public static void main(String[] args) {
		String s1 = new String("Java");// Um objeto String "Java" foi criado e
										// foi para o pool, assim quando ou se
										// outra String
										// "Java" for criada
										// simplesmente essa nova variavel pega
										// a referencia da String "Java"
										// anterior.
		String s2 = "Java";

		System.out.println(s1.hashCode());
		System.out.println(s2.hashCode());
	}
}

Na minha opiniao é isso, e tambem foi o que eu entendi do livro do Roberto Serson.
Rodem o programa e vejam como os hashcodes sao iguais.
No comando (String s = “Fred”:wink: uma objeto String é criado da mesma forma como usando
a palavra “new”, porém só se esta String ainda não foi criada, se não, entao ela simplesmente pega
a referencia da String igual anterior.

I

me desculpem, acho que eu falei besteira. Mas se for verdade, entao o livro ta errado.

Eric_Yuzo

IronM:
ta muito estranho isso, se na primeira linha, ou seja, na atribuição (String s = “Fred”) fala que pegou essa
literal do pool de Strings, qual a diferença para o codigo na proxima linha (s = s + “47”) sendo que o 47 tambem
vem do pool???

Na verdade nunca me interessei muito em saber os detalhes do pool de Strings, só sabia que existia mesmo. Mas fiquei um pouco curioso com o tópico e acabei pesquisando no google e entendi algumas coisas que não fogem do que foi citado no tópico que indiquei (pode ser que eu tenha entendido errado, não nego). As leituras mais esclarecedoras na minha opinião foram:

http://java.sun.com/docs/books/performance/1st_edition/html/JPMutability.fm.html

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

E diversos posts do thingol aqui no GUJ.

Na questão levantada, o que eu entendi é que “Fred” e “47” já estão no pool desde que a classe foi carregada, porque foram declarados como literais entre as aspas, porém “Fred47” não, ele foi criado no momento que houve a concatenação (s + “47”) dentro do método citado.

Agora no caso do hashCode, se for implementado na classe para gerar o número de acordo com o conteúdo, vai retornar o mesmo número quando os objetos tiverem o mesmo conteúdo, mas não significa que é o mesmo objeto instanciado na memória.

Bom, esta é a minha opinião.

I

Oi de novo amigos, aproveitando este mesmo topico, tenho outra suspeita de uma questão do testkiller:

abstract class A{
      abstract void a1();
      void a2() {}
 }
 class B extends A {
      void a1() {}
      void a2() {}
}
 class C extends B {
      void c1() {} 
}

public class Questao141 {
	public static void main(String[] args) {
		A x = new B(); 
		C y = new C(); 
		A z = new C();
		
		 x.a2();
		 z.a2();
		 z.c1();
		 z.a1();
		 y.c1();//como é que essa pode ser certa??
		 x.a1();
	}
}

aquela alternativa não pode estar certa, sendo que uma referecia do tipo “C” recebe de fato um “C”,
como a chamada a o metodo “c1” pode ser polimorfica senfo que o metodo “c1” só é definido
na classe “C”? sera que estou enganado?

obrigado

giselezr

desenterrando o tópico… alguém sabe porque ?

I

é cara… certeza

tá errado kkkkk

Criado 4 de janeiro de 2011
Ultima resposta 21 de jan. de 2013
Respostas 15
Participantes 6