quarta-feira, 6 de março de 2013

Os 10 Erros Mais comuns em Java


Top  Erros de programadores Java 


Se você programar regularmente em Java, e sei que como a palma da sua mão, ou se você é novo para a língua ou um programador casual, você vai cometer erros. É natural, é humano, e adivinhem? Você mais do que provável cometer os mesmos erros que os outros fazem, uma e outra vez. Aqui está a minha lista dos dez erros que todos nós parecem fazer em um momento ou outro, como identificá-los, e como corrigi-los.

10. Acessando variáveis ​​não-estáticos membros de métodos estáticos (como principal)

Muitos programadores, particularmente quando foi introduzida Java, ter problemas ao acessar variáveis ​​de membros de seu principal método. A assinatura do método para a principal é marcado estática - o que significa que não precisamos criar uma instância da classe para chamar o método principal. Por exemplo, uma máquina virtual Java (JVM) pode chamar o MyApplication classe como este: -
MyApplication.main (command_line_args);
Isto significa, no entanto, que não é uma instância de MyApplication - ele não tem todas as variáveis ​​de membro para acessar! Tomemos por exemplo a seguinte aplicação, o que irá gerar uma mensagem de erro do compilador.
public class StaticDemo
{
        public String my_member_variable = "somedata";
        public static void main (String args [])
        {
  / / Acessar um membro não-estática do método estático
                System.out.println ("Isso gera um erro do compilador" +
   my_member_variable);
        }
}
Se você deseja acessar suas variáveis ​​membro de um método não-estático (como principal ), você deve criar uma instância do objeto. Aqui está um exemplo simples de como escrever corretamente o código para acessar variáveis ​​não-estáticos membros, criando primeiro uma instância do objeto.
public class NonStaticDemo
{
        public String my_member_variable = "somedata";

        public static void main (String args [])
        {
                NonStaticDemo demonstração = new NonStaticDemo ();

  / Variável de membro / Acesso de demonstração
                System.out.println ("Isso não vai gerar um erro" +
                        demo.my_member_variable);
        }
}

9. Mistyping o nome de um método ao substituir

Substituindo permite aos programadores para substituir a implementação de um método com o novo código. Substituindo é um recurso útil, e programadores mais OO fazem uso pesado dele.Se você usar o AWT 1,1 modelo de tratamento de eventos, muitas vezes você vai substituir implementações ouvinte para fornecer funcionalidade personalizada. Uma armadilha fácil de cair com os superiores, é digitar o nome do método. Se você digitar o nome, você não está mais substituir um método - que você está criando um método inteiramente novo, mas com o mesmo parâmetro e tipo de retorno.
MyWindowListener public class {WindowAdapter
 / / Este deve ser windowClose d
 public void windowClose (WindowEvent e) {
  / / Sair quando o usuário fecha a janela
  System.exit (0);
 }
});
Compiladores não vai pegar um presente, e que o problema pode ser bastante frustrante para detectar. No passado, eu olhei para um método, acreditava que ele estava sendo chamado, e levado séculos para detectar o problema. O sintoma deste erro será que o seu código não está sendo chamado, ou você acha que o método tem pulado seu código. O único jeito de ter certeza é adicionar uma declaração println, para gravar uma mensagem em um arquivo de log, ou para usar depurador traço bom (como o Visual J + + ou Borland JBuilder) e percorrer linha por linha. Se o seu método ainda não está sendo chamado, então é provável que você tenha digitado incorretamente o nome.

8. Atribuição de comparação (=, em vez de ==)

Este é um erro fácil de fazer. Se você está acostumado outras línguas antes, como Pascal, você vai perceber o quão ruim isto era uma escolha pelos designers da linguagem. Em Pascal, por exemplo, usamos o operador: = para atribuição, e deixar = para comparação. Isto parece um retrocesso para C / C + +, Java a partir do qual tira as suas raízes.
Felizmente, mesmo se você não manchar este um olhando código na tela, o seu compilador.Mais comumente, ele informará uma mensagem de erro como este: "Não é possível converter xxx para boolean", onde xxx é um tipo Java que você está atribuindo ao invés de comparar.

7. Comparando dois objetos (== em vez de. Iguais)

Quando usamos o operador ==, na verdade estamos comparando duas referências de objeto, para ver se eles apontam para o mesmo objeto. Não podemos comparar, por exemplo, duas cordas de igualdade, usando o operador ==. Nós deve usar o. Método é igual, que é um método herdado por todas as classes de java.lang.Object.
Aqui está a forma correta de comparar duas seqüências.
Seqüência abc = "abc"; Cordas def = "def";

/ Forma / Bad
if ((abc + def) == "abcdef")
{
    ......
}
/ Forma / Bom
if ((abc + def). equals ("abcdef"))
{
   .....
}

6. A confusão sobre passagem por valor e passagem por referência

Isso pode ser um problema frustrante para diagnosticar, porque quando você olha para o código, você pode ter certeza de que a sua passagem por referência, mas achar que a sua verdade sendo passado por valor. Java usa tanto , então você precisa entender quando você está passando por valor, e quando você está passando por referência.
Quando você passa um tipo de dados primitivo, como um char, int, float, ou duplo, para uma função, então você está passando por valor . Isso significa que uma cópia do tipo de dados é duplicada, e passado para a função. Se a função de escolha para modificar esse valor, será a modificação da cópia única. Assim que terminar de função, eo controle é retornado para a função de retornar, a variável "real" não serão alterados, e nenhuma alteração terá sido salvo.Se você precisar modificar um tipo de dados primitivo, torná-lo um valor de retorno para uma função, ou envolvê-la dentro de um objeto.
Quando você passar um objeto Java, tal como uma matriz, um vetor, ou uma corda, para uma função, então você está passando por referência . Sim - um String é realmente um objeto, e não um tipo de dados primitivo. Então isso significa que se você passar um objeto para uma função, você está passando uma referência a ele, e não uma duplicata. Todas as alterações feitas às variáveis ​​do objeto membros será permanente - o que pode ser bom ou ruim, dependendo se era isso o que você pretende.
Em uma nota lateral, já que String contém nenhum método para modificar seu conteúdo, assim como você pode estar passando por valor.

5. Escrever manipuladores de exceção em branco

Eu sei que é muito tentador para escrever manipuladores de exceção em branco, e apenas para ignorar os erros. Mas se você tiver problemas, e não por escrito, quaisquer mensagens de erro, torna-se quase impossível para descobrir a causa do erro. Mesmo a mais simples manipulador de exceção pode ser do benefício. Por exemplo, colocar um try {.. Exceção} catch em torno de seu código, para capturar qualquer tipo de exceção, e imprimir a mensagem. Você não precisa escrever um manipulador personalizado para cada exceção (embora este ainda é boa prática de programação). Nunca deixe em branco, ou você não vai saber o que está acontecendo.
Por exemplo
public static void main (String args [])
{
    try {
 / / Seu código vai aqui ..
    }
    catch (Exception e)
    {
 System.out.println ("Err -" + e);
    }
}

4. Esquecendo-se de que o Java é com índice zero

Se você veio de um C / C + + fundo, você não pode achar isso muito um problema tão grande como aqueles que usaram outros idiomas. Em Java, arrays são com índice zero, o que significa que o índice do primeiro elemento é realmente 0. Confuso? Vejamos um exemplo rápido.
/ / Cria uma matriz de três cordas
String [] strArray = new String [3];

Índice do elemento / / Primeiro é realmente 0
strArray [0] = "string primeiro";

/ / Index Segundo elemento é na verdade um
strArray [1] = "segunda corda";

/ / Índice do elemento final é realmente 2
strArray [2] = "Terceira e última string";
Neste exemplo, temos uma matriz de três cordas, mas para acessar elementos do array que realmente subtrair um. Agora, se fôssemos tentar acessar strArray [3], estaríamos acessando o quarto elemento. Este será um caso ArrayOutOfBoundsException para ser jogado - o sinal mais evidente de esquecer a regra de indexação de zero.
Outras áreas em que zero indexação pode você vai ter problemas é com cordas. Suponha que você queria ter um personagem em um deslocamento específico dentro de uma cadeia. Usando o String.charAt função (int) você pode olhar esta informação -, mas em Java, a classe String também é zero indexado. Isso significa que o primeiro caractere é no deslocamento 0, eo segundo no deslocamento 1. Você pode ter alguns problemas muito frustrante se você está ciente disso - especialmente se você escrever aplicações com processamento de cadeia pesada. Você pode estar trabalhando no personagem errado, e também lançar exceções em tempo de execução. Assim como o ArrayOutOfBoundsException, há uma cadeia equivalente.Acessando além dos limites de uma String irá causar um StringIndexOutOfBoundsException para ser jogado, como demonstrado por este exemplo.
public class StrDemo
{
 public static void main (String args [])
 {
        Seqüência abc = "abc";

        System.out.println ("Char no offset 0:" + abc.charAt (0));
        System.out.println ("Char no deslocamento 1:" + abc.charAt (1));
        System.out.println ("Char no deslocamento 2:" + abc.charAt (2));

 / / Esta linha deve lançar uma StringIndexOutOfBoundsException
        System.out.println ("Char no deslocamento 3:" + abc.charAt (3));
 }
}
Observe também, que o zero-indexação não se aplica apenas para matrizes, ou para Strings.Outras partes da Java também são indexados, mas nem sempre de forma consistente. O java.util.Date, e as aulas começam suas java.util.Calendar meses com 0, mas dias começam normalmente com 1. Este problema é demonstrado através da aplicação seguinte.
importar java.util.Date;
importar java.util.Calendar;

ZeroIndexedDate classe pública
{
        public static void main (String args [])
        {
                / / Pega a data de hoje
                A data de hoje = new Date ();
 
  Valor de retorno / / Imprime de getMonth
  System.out.println ("Date.getMonth () retorna:" +
    today.getMonth ());

  / / Pega a data de hoje com um calendário
  Calendário RightNow = Calendar.getInstance ();

  Valor de retorno / / Imprime de obter (Calendar.MONTH)
  System.out.println ("Calendar.get (mês) retorna:" +
   rightNow.get (Calendar.MONTH));
        }
}
Zero indexação só é um problema se você não perceber que a sua ocorrência. Se você acha que está correndo em um problema, consulte sempre seu documentação da API.

3. Impedir o acesso simultâneo a variáveis ​​compartilhadas por tópicos

Ao escrever aplicações multi-threaded, muitos programadores (eu incluído), muitas vezes cortar caminho, e deixar seus aplicativos e applets vulneráveis ​​a conflitos de rosca. Quando dois ou mais segmentos de acessar os mesmos dados ao mesmo tempo, existe a possibilidade (e segurando lei de Murphy, a probabilidade) que duas threads acessar ou modificar os mesmos dados ao mesmo tempo. Não se engane em pensar que esses problemas não ocorrerão em single-threaded processadores. Ao acessar alguns dados (realizando uma leitura), a sua discussão pode ser suspensa, e outro segmento programado. Ele escreve seus dados, o que é, então, substituído quando o primeiro segmento faz suas mudanças.
Tais problemas não são apenas limitados a aplicações multi-threaded ou applets. Se você escrever APIs Java, ou JavaBeans, então seu código pode não ser thread-safe. Mesmo se você nunca escrever um único aplicativo que usa fios, as pessoas que utilizam seu código será.Para a sanidade dos outros, se não a si mesmo, você sempre deve tomar precauções para evitar o acesso simultâneo a dados compartilhados.
Como este problema pode ser resolvido? O método mais simples é fazer com que as suas variáveis ​​privada (mas você fazer isso já, certo?) E usar métodos de acesso sincronizados.Métodos de acesso para permitir o acesso variáveis ​​de membros particulares, mas de uma maneira controlada. Tome os seguintes métodos de acesso, que proporcionam uma forma segura para alterar o valor de um contador.
mycounter classe pública
{
 private int count = 0; / / contagem começa em zero

 setCount public synchronized void (int quantidade)
 { 
  contar = quantidade;
 }
 
 getCount int público sincronizado ()
 {
  retornar a contagem;
 }
}

2. Erros de capitalização

Este é um dos erros mais freqüentes que todos nós fazemos. É tão simples, e às vezes um pode olhar para uma variável ou método uncapitalized e ainda não detectar o problema. Eu mesmo já intrigado com esses erros, porque eu reconheço que o método ou variável existe, mas não manchar a falta de capitalização.
Enquanto não há bala de prata para detectar esse erro, você pode facilmente treinar-se para fazer menos deles. Há um truque muito simples que você pode aprender: -
  • todos os métodos e variáveis ​​de membro da API Java começam com letras minúsculas
  • todos os métodos e variáveis ​​de membro usar capitalização, onde uma nova palavra começa por exemplo - getDoubleValue ()
Se você usar esse padrão para todas as suas variáveis ​​de membros e classes, e então fazer um esforço consciente para acertar, você pode reduzir gradualmente o número de erros que você vai fazer. Pode demorar um pouco, mas pode poupar algum arranhão grave na cabeça no futuro.

(Rufar de tambores)

E o número um erro que os programadores Java fazer!!


1. Ponteiros nulos!

Ponteiros nulos são um dos erros mais comuns que os programadores Java faz. Compiladores não pode verificar isso para você - ela só vai surgir em tempo de execução, e se você não descobri-lo, os usuários certamente.
Quando uma tentativa de acessar um objeto é feito, ea referência a esse objeto é nulo, uma NullPointerException será lançada. A causa de ponteiros nulos pode ser variado, mas em geral isso significa que ou você não inicializou um objeto, ou você ainda não conferiu o valor de retorno de uma função.
Muitas funções retornar nulo para indicar uma condição de erro - mas a menos que você verifique os valores de seu retorno, você nunca vai saber o que está acontecendo. Como a causa é uma condição de erro, o teste normal não pode buscá-lo - o que significa que os usuários irão acabar por descobrir o problema para você. Se a função da API indica que nula pode ser devolvido, não se esqueça de verificar isso antes de usar o objeto de referência!
Outra causa é o lugar onde sua inicialização tem sido desleixado, ou onde ela é condicional. Por exemplo, examine o seguinte código, e veja se você pode detectar o problema.
public static void main (String args [])
{
 / / Aceitar até 3 parâmetros
 String [] lista = new String [3];

 int index = 0;

 enquanto (índice (<args.length) && (índice <3))
 {
  lista [index + +] = args [índice];
 }

 / / Verificar todos os parâmetros 
 for (int i = 0; i <list.length; i + +)
 {
  if (lista [i]. equivale a "ajuda")
  {
   / / .........
  }
  outro
  if (lista [i]. iguais "-cp")
  {
   / / .........
  }
  / / Else .....
 } 
}
Este código (enquanto um exemplo fictício), mostra um erro comum. Em algumas circunstâncias, onde o usuário insere três ou mais parâmetros, o código irá correr bem. Se nenhum parâmetro for inserido, você vai ter um NullPointerException em tempo de execução.Às vezes, suas variáveis ​​(a matriz de strings) será inicializado, e outras vezes não. Uma solução fácil é verificar antes de você tentar acessar uma variável em uma matriz que não é igual a nulo.

Resumo

Esses erros representam apenas alguns dos muitos que todos fazemos. Embora seja impossível eliminar completamente os erros do processo de codificação, com cuidado e prática, você pode evitar a repetição dos mesmos. Tenha certeza, porém, que todos os programadores Java encontrar os mesmos tipos de problemas. É reconfortante saber que, enquanto você trabalha até tarde da noite rastrear um erro, alguém, em algum lugar, em algum momento, vai cometer o mesmo erro!


Fonte:http://www.javacoffeebreak.com/articles/toptenerrors.html

Nenhum comentário:

Postar um comentário