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 if
instrucț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 String
obiect
Programatorii începători uită adesea că toate obiectele clasei sunt imuabile și că fiecare metodă a String
clasei 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 public
modificatorul î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 Solution
clasei ș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 value va 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 extends
cuvântul cheie:
class Pet
{
}
class Cat extends Pet
{
}
Când o clasă moștenește o interfață, trebuie să utilizați implements
cuvântul cheie:
interface Meow
{
}
class Cat implements Meow
{
}
Când o interfață moștenește o interfață, utilizați cuvântul extends
cheie:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Omiterea break
într-o switch
declarație
Iar ultima greșeală pentru noi astăzi, dar nu ultima pentru începători, este că nu includem o break
declarație într-o switch
declarație. Exemplu
Gresit | Dreapta |
---|---|
|
|
GO TO FULL VERSION