1. Sammenligning af objekter med==
Den foretrukne fejl hos nybegyndere programmører er at sammenligne objekter (især strenge) ved hjælp af ==
operatøren. For eksempel:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
Denne kode vil aldrig vise "Strengene er ens", fordi sætningen if
sammenligner referencer til to forskellige strengobjekter.
Her er den korrekte version af koden:
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. Ændring af et String
objekt
Nybegyndere programmører glemmer ofte, at alle objekter i klassen er uforanderlige , og at hver metode i String
klassen returnerer et nyt objekt - det aktuelle objekt ændres aldrig.
Eksempel:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
Denne kode minder meget om den korrekte kode, men den virker ikke som forventet. Metoden toUpperCase()
ændrer ikke det objekt, den kaldes på. Den korrekte kode ville se sådan ud:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
3. Glemmer at initialisere objekter, der er elementer i et array
En anden almindelig fejl er at glemme at initialisere en array-variabel. Eksempel:
int[] array;
array[0] = 1;
array[0] = 2;
Denne kode virker ikke: du skal udtrykkeligt indstille array-variablen lig med en reference til containerobjektet, der gemmer elementerne i arrayet.
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
4. Brug af en lokal variabel i stedet for en instansvariabel.
Nybegyndere kan ikke lide at komme med lange og meningsfulde navne til variabler. De bruger ofte enkeltbogstavsnavne: a
, b
, i
, osv. Det er en grusom ting at gøre, når koden har flere variabler som denne:
Indsæt tallet 99 i 100 celler i en matrix |
---|
|
Ovenstående kode vil ikke kompilere. Den korrekte version ser således ud:
Indsæt tallet 99 i 100 celler i en matrix |
---|
|
5. Fjernelse af et samleobjekt
Meget ofte er der situationer, hvor et bestemt element skal fjernes fra en samling. Koden ser nogenlunde sådan ud:
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);
Denne kode virker ikke, fordi du ikke kan bruge en for-hver-løkke til samtidig at krydse elementerne i en samling og ændre den samling.
Der er flere løsninger. Først kan du gå gennem en samling og ændre en anden:
Løsning 1 |
---|
|
For det andet, siden Java 8, har samlinger en removeIf()
metode, hvortil du kan sende en regel (lambda-funktion), der angiver, hvilke elementer der skal fjernes.
Eksempel:
Løsning 2 |
---|
|
6. Placering af flere klasser med public
modifikatoren i en enkelt fil
Der kan kun være én offentlig klasse i en fil. Flere klasser kan erklæres i en fil, men de skal enten være indre klasser af en offentlig klasse eller ikke have modifikatoren public
. Eksempel:
Indholdet af filen Solution.java | Bemærk |
---|---|
|
Dette er ikke tilladt: to offentlige klasser i en enkelt fil. |
|
Men du kan gøre dette. Hovedklassen er ikke offentlig |
|
Og du kan gøre dette. Hovedklassen er en indlejret klasse |
7. Kaldning af almindelige (ikke-statiske) metoder i en klasse fra den statiske main()
metode
Nogle gange forsøger nybegyndere programmører at få adgang til ikke-statiske variabler og metoder fra metoden main()
eller andre statiske metoder. En sådan kode virker selvfølgelig ikke.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
Hovedmetoden kan kun referere til statiske metoder/variabler. Nå, eller det skal først oprette en forekomst af klassen Solution
og først derefter kalde ikke-statiske metoder for det objekt. Eksempel:
Løsning 1 | Løsning 2 |
---|---|
|
|
8. Erklære en konstruktør som en metode
En anden almindelig fejl er forkert at erklære en klassekonstruktør. Navnet på en konstruktør skal være det samme som navnet på klassen, og en konstruktør har ingen resultattype. De mest almindelige fejl ser sådan ud:
|
Der burde ikke være en returtype her |
|
Ugyldigt konstruktørnavn. Navnet på konstruktøren skal matche klassenavnet |
|
this mangler. Variablen value vil blive tildelt sig selv |
|
Det er alt sammen korrekt |
9. Forkert nedarvning af grænseflader
Javas skabere forsøgte at gøre det meget tæt på engelsk, så de valgte forskellige søgeord for visse relaterede begreber.
Når en klasse arver en klasse, skal du bruge nøgleordet extends
:
class Pet
{
}
class Cat extends Pet
{
}
Når en klasse arver en grænseflade, skal du bruge nøgleordet implements
:
interface Meow
{
}
class Cat implements Meow
{
}
Når en grænseflade arver en grænseflade, skal du bruge nøgleordet extends
:
interface Meow
{
}
interface Voice extends Meow
{
}
10. Udeladelse break
i en switch
redegørelse
Og den sidste fejl for os i dag, men ikke den sidste for begyndere, er at undlade at inkludere en break
erklæring i en switch
erklæring. Eksempel
Forkert | Højre |
---|---|
|
|
GO TO FULL VERSION