Pegadinhas do Java (SCJP6)

1) Método Collections.binarySearch exige um Collections.sort antes, pois senão o output será indefinido.

 

2) Ao declarar uma expressão regex em uma String usar duas barras (ex: \\s ao invés de \s)

 

3) Variáveis de blocos acessadas fora do escopo delas

 

    

    Ou

     

4) Em métodos estáticos, verificar se há acessos a alguma variável de instância

 

Ou

 

 
 

5) Em retorno de métodos com inteiros, verificar o tipo e o que está sendo retornado

     

6) Em classes que estende de outras, verificar se a superclasse implementa o construtor padrão

 

Por padrão no código acima a classe Derived como não declarou explicitamente seu construtor, então o compilador criará para ela automaticamente o seguinte construtor:

    public Derived() {

        super(); // aqui está o erro, pois a superclasse não implementa o construtor sem parâmetros !

    }

 

Para corrigir este problema ou a superclasse (Base) deve implementar o construtor sem parâmetros ou a subclasse (Derived) deve implementar seu construtor da seguinte forma:

    public Derived() {

        super(1); // Assim está ok !

    }

 

7) Os métodos implementados de uma interface devem ser públicos

 

8) Inner (method) classes só podem acessar variáveis declaradas dentro do método caso elas sejam ‘final’.

 

9) Ao se criar uma array inserindo elementos na mesma não é especificado o tamanho:

 

int[] i = new int[]{1,2,3}; // certo

int[] i = new int[3]{1,2,3}; // errado

 
 

10) Em objetos adicionados em uma TreeSet verificar se eles implementam comparable.

 

Podemos observar que a classe Pessoa não implementa a interface Comparable e mesmo assim seus objetos instanciados puderam ser adicionados em uma TreeSet.

 
 

SEGUE O CÓDIGO:

 
 

import java.util.TreeSet;

import java.util.Comparator;

 
 

public class Teste {

public static void main(String[] args){

TreeSet<Pessoa> set1 = new TreeSet<Pessoa>(new PorIdade());

set1.add(new Pessoa(“pedro”, 34));

set1.add(new Pessoa(“lorena”, 2));

set1.add(new Pessoa(“kike”,5));

set1.add(new Pessoa(“juliane”,32));

System.out.println(“ordem de idade -” + set1);

 
 

// Como não podemos mudar o algorítmo de classificação dos elementos de uma TreeSet atribuindo-a um novo objeto que implemente a interface Comparator, então temos que criar uma nova instância de TreeSet e na criação passar o novo algoritmo de classificação dos elementos, neste caso representado pela classe “PorNome”.

TreeSet<Pessoa> set2 = new TreeSet<Pessoa>(new PorNome());

set2.addAll(set1);

System.out.println(“ordem de nome – ” + set2);        

}

}

Output:

ordem de idade -[lorena – 2, kike – 5, juliane – 32, pedro – 34]

ordem de nome – [juliane – 32, kike – 5, lorena – 2, pedro – 34]

 
 

// Repare que a classe pessoa não implementa a interface Comparable.

class Pessoa {

public String nome;

public Integer idade;

public Pessoa(String nome, Integer idade){

this.nome = nome;

this.idade = idade;

}

public String toString(){

return String.format(“%1$s – %2$d”,this.nome, this.idade);

}

}

 
 

// Comparators

class PorIdade implements Comparator<Pessoa> {

public int compare(Pessoa p1, Pessoa p2){

return p1.idade.compareTo(p2.idade);

}

}

 
 

class PorNome implements Comparator<Pessoa> {

public int compare(Pessoa p1, Pessoa p2){

return p1.nome.compareTo(p2.nome);

}

}

 
 

 
 

11) Valor não booleano em expressão assert

 

No exemplo acima estamos atribuindo um valor para a variável “rate” e não verificando se ela é igual a constante LOCAL_RATE.

 

12) Valores iguais em expresão ‘case’ de switch.

 

 
 

13) Acessar membro protected de outro package sem ser via herança.

 

    

14) Acessar membro default de outro package

 

    

     

15) Top-Level Class só podem ser publicas ou {default}

 

    

 
 

16) (Herança e Membro privado) Tentar acessar membro privado obfuscado por uma herança que o torna público

 

 

Observações)

  1. A herança do método ‘aMethod()’ não ocorre de Base para Over pois ele é privado.
  2. A classe Over, ao declarar o seu método ‘aMethod()’ não estará, neste caso, sobrecarregando o método da superclasse pois conforme já falamos ele não é herdado já que é privado.

 

 

17) Iterator retorna object

 

 

Teria que haver um cast para: (Integer) i.next();.

 

18) Array não tem método length()

 

 

 

19) Unreachable Statement

 

 

20) Função sem retorno

 

 
 

21) Passagem de argumentos int para parâmetros short

 

class Alien {

String invade(short ships) { return “a few”; }

String invade(short… ships) { return “many”; }

}

class Defender {

public static void main(String [] args) {

System.out.println(new Alien().invade(7)); // literal 7 é inteiro

}

}

 
 

22) Declarar uma variável em um âmbito em que ela já exista

 

public class Param {

public void doSomething(int value){

for(int value = 0; value < 10; value ++);

}

}

javac:

Param.java:3: value is already defined in doSomething(int)

for(int value = 0; value < 10; value ++)

^

1 error

 
 

 
 

Anúncios
Esta entrada foi publicada em Java com as etiquetas . ligação permanente.

Uma resposta a Pegadinhas do Java (SCJP6)

  1. Pingback: certificado SCJP / OCJP | Pedro Abs

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s