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 |
|---|
|
Codul de mai sus nu se va compila. Versiunea corectă arată astfel:
| Puneți numărul 99 în 100 de celule dintr-o matrice |
|---|
|
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 |
|---|
|
Î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 |
|---|
|
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ă |
|---|---|
|
Acest lucru nu este permis: două clase publice într-un singur fișier. |
|
Dar poți face asta. Clasa principală nu este publică |
|
Ș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 |
|---|---|
|
|
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:
|
Nu ar trebui să existe un tip de returnare aici |
|
Nume de constructor nevalid. Numele constructorului trebuie să se potrivească cu numele clasei |
|
this lipseste. Variabila valueva fi atribuită ei înșiși |
|
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 |
|---|---|
|
|
GO TO FULL VERSION