CodeGym /Curs Java /All lectures for RO purposes /Greșeli populare făcute de programatori începători

Greșeli populare făcute de programatori începători

All lectures for RO purposes
Nivel , Lecţie
Disponibil

1. Compararea obiectelor cu==

Greșeala preferată a programatorilor începători este compararea obiectelor (în special șiruri de caractere) folosind operatorul ==. De exemplu:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
   System.out.println("The strings are equal");
}

Acest cod nu va afișa niciodată „Șirurile sunt egale”, deoarece ifinstrucțiunea compară referințe la două obiecte șir diferite.

Iată versiunea corectă a codului:

Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1.equals(s2))
{
   System.out.println("The strings are equal");
}


2. Schimbarea unui Stringobiect

Programatorii începători uită adesea că toate obiectele clasei sunt imuabile și că fiecare metodă a Stringclasei returnează un obiect nou - obiectul curent nu se schimbă niciodată.

Exemplu:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

Acest cod este foarte asemănător cu codul corect, dar nu va funcționa conform așteptărilor. Metoda toUpperCase()nu schimbă obiectul pe care este apelată. Codul corect ar arăta astfel:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase


3. Uitând să inițializați obiectele care sunt elemente ale unui tablou

O altă greșeală comună este să uitați să inițializați o variabilă matrice. Exemplu:

int[] array;
array[0] = 1;
array[0] = 2;

Acest cod nu va funcționa: trebuie să setați în mod explicit variabila matricei egală cu o referință la obiectul container care va stoca elementele matricei.

int[] array = new int[10];
array[0] = 1;
array[0] = 2;


4. Folosind o variabilă locală în loc de o variabilă de instanță.

Începătorilor nu le place să vină cu nume lungi și semnificative pentru variabile. Ei folosesc frecvent nume cu o singură literă: a, b, i, etc. Este un lucru crud de făcut atunci când codul are mai multe variabile de genul acesta:

Puneți numărul 99 în 100 de celule dintr-o matrice
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

Codul de mai sus nu se va compila. Versiunea corectă arată astfel:

Puneți numărul 99 în 100 de celule dintr-o matrice
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < count; i++)
      {
         a[i] = value;
      }
   }
}


5. Eliminarea unui articol de colecție

Foarte des există situații în care un anumit element trebuie eliminat dintr-o colecție. Codul arată cam așa:

ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

for (Integer value: list)
   if (value < 0)
      list.remove(value);

Acest cod nu va funcționa, deoarece nu puteți folosi o buclă for-each pentru a parcurge simultan elementele unei colecții și a modifica acea colecție.

Există mai multe soluții. În primul rând, puteți parcurge o colecție și schimba alta:

Soluția 1
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

În al doilea rând, începând cu Java 8, colecțiile au o removeIf()metodă, căreia îi puteți transmite o regulă (funcția lambda) care indică ce elemente să eliminați.

Exemplu:

Soluția 2
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );


6. Plasarea mai multor clase cu publicmodificatorul într-un singur fișier

Într-un fișier poate exista o singură clasă publică. Mai multe clase pot fi declarate într-un fișier, dar trebuie fie să fie clase interne ale unei clase publice, fie să nu aibă modificatorul public. Exemplu:

Conținutul fișierului Solution.java Notă
public class Solution
{
}
public class Main
{
}
Acest lucru nu este permis: două clase publice într-un singur fișier.
public class Solution
{
}
class Main
{
}
Dar poți face asta. Clasa principală nu este publică
public class Solution
{
  public static class Main
  {
  }
}
Și poți face asta. Clasa principală este o clasă imbricată


7. Apelarea metodelor obișnuite (non-statice) ale unei clase din main()metoda statică

Uneori, programatorii începători încearcă să acceseze variabile și metode non-statice din main()metodă sau din alte metode statice. Un astfel de cod nu va funcționa, desigur.

public class Solution
{
   public int n = 100;
   public int[] createArray()
   {
      return new int[n];
   }

   public static void main(String[]args)
   {
      int[] array = createArray();
   }
}

Metoda principală se poate referi doar la metode/variabile statice. Ei bine, sau trebuie mai întâi să creeze o instanță a Solutionclasei și abia apoi să apeleze metode non-statice ale acelui obiect. Exemplu:

Soluția 1 Soluția 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}


8. Declararea unui constructor ca o metodă

O altă greșeală comună este declararea incorectă a unui constructor de clasă. Numele unui constructor trebuie să fie același cu numele clasei, iar un constructor nu are un tip de rezultat. Cele mai frecvente greșeli arată astfel:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}




Nu ar trebui să existe un tip de returnare aici
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}




Nume de constructor nevalid. Numele constructorului trebuie să se potrivească cu numele clasei
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}






this lipseste. Variabila valueva fi atribuită ei înșiși
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}




Totul este corect


9. Moștenirea incorectă a interfețelor

Creatorii lui Java au încercat să o apropie foarte mult de engleză, așa că au ales cuvinte cheie diferite pentru anumite concepte înrudite.

Când o clasă moștenește o clasă, trebuie să utilizați extendscuvântul cheie:

class Pet
{
}

class Cat extends Pet
{
}

Când o clasă moștenește o interfață, trebuie să utilizați implementscuvântul cheie:

interface Meow
{
}

class Cat implements Meow
{
}

Când o interfață moștenește o interfață, utilizați cuvântul extendscheie:

interface Meow
{
}

interface Voice extends Meow
{
}


10. Omiterea breakîntr-o switchdeclarație

Iar ultima greșeală pentru noi astăzi, dar nu ultima pentru începători, este că nu includem o breakdeclarație într-o switchdeclarație. Exemplu

Gresit Dreapta
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION