"Hej, Amigo! Lad os fortsætte med at tale om fejl. Denne gang vil vi udforske fejl, som kompilatoren ikke altid vil hjælpe dig med. Vær opmærksom, og du vil lære noget om dig selv."
"Jeg er klar til at lytte, Diego. Jeg håber ikke, det her bliver for pinligt for mig."
Sammenligning af objekter med==
"Vores liste over de bedste nybegyndere programmørfejl begynder med at sammenligne objekter (især strenge) ved hjælp af operatoren ==
"
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");
}
"Det har jeg gjort ret ofte. Nu kan jeg tydeligt se, at denne kode aldrig vil vise "Strengene er lige", fordi sætningen if
sammenligner referencer til to forskellige strengobjekter."
"Ja. Derfor ville den rigtige mulighed være:
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");
}
Æ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."
"Det er ikke så længe siden, at jeg lærte, hvad uforanderlig betyder, men jeg tror, jeg har gjort det her.
"Jeg er ret sikker på det. Eksempel:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
"Denne kode minder meget om korrekt kode, men den vil ikke fungere som forventet. Metoden toUpperCase()
ændrer ikke det objekt, som den kaldes på. Den korrekte kode ville se sådan ud:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
"Nøjagtig. Det har jeg gjort, men jeg forstod ikke engang rigtig, hvad der var galt. Tak for opklaringen!"
Glemmer at initialisere objekter, der er elementer i et array
"En anden almindelig fejl er at glemme at initialisere en matrixvariabel. 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. Korrekt version:
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
Brug af en lokal variabel i stedet for en instansvariabel.
"Nybegyndere kan ikke lide at komme med lange og meningsfulde navne til variabler."
"Det er så sandt. For at få tingene gjort hurtigt, giver jeg nogle gange variabler navne som a
, b
, og i
."
"Gør det ikke. 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 |
---|
|
"Det er meget sværere at lave fejl i kode med egennavne. Den korrekte version ser sådan ud:
Indsæt tallet 99 i 100 celler i en matrix |
---|
|
Fjernelse af et samlingsobjekt
"Har du allerede kigget på samlinger?"
"Bogstaveligt talt med kun et øje."
"Hvis du ikke ved, hvad jeg taler om, så gør en note til dig selv for at tage et kig i fremtiden. Meget ofte er der situationer, hvor et bestemt element skal fjernes fra en samling. Koden ser nogenlunde ud som det her:
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 vil ikke fungere, fordi du ikke kan bruge en for-each
loop til samtidig at krydse elementerne i en samling og ændre den samling.
"Der er flere løsninger. For det første 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 |
---|
|
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 |
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. Sådan kode vil selvfølgelig ikke fungere.
public class Solution
{
public int n = 100;
public int[] createArray()
{
return new int[n];
}
public static void main(String[]args)
{
int[] array = createArray();
}
}
" main
Metoden kan kun henvise til statiske metoder/variabler. Tja, eller den skal først oprette en instans af klassen Solution
og først derefter kalde ikke-statiske metoder for det objekt. Eksempel:
Løsning 1 | Løsning 2 |
---|---|
|
|
Erklærer en konstruktør som en metode
"En anden almindelig fejl er at deklarere en klassekonstruktør forkert. 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åledes ud:
|
Der burde ikke være en returtype her |
|
Konstruktørnavnet er ugyldigt. Det skal matche klassenavnet |
|
this mangler. Variablen value vil blive tildelt sig selv |
|
Det er alt sammen korrekt. |
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 koncepter.
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 eller mere præcist implementerer den, 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 Meov
{
}
Udeladelse break
i en switch
erklæring
"Og den sidste fejl for 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 |
---|---|
|
|
"Du ved, Diego... At dømme efter det sæt af fejl, du præsenterede her, føles det som om du har læst min personlige journal... Eller du har set mig løse opgaver."
"Ha! Er ikke i tvivl om det. Jeg har læst, sporet og fortsætter med at gøre det. Så vær på vagt!"
"???"
"Bare rolig. Jeg laver bare sjov. Vær på vagt og lav færre dumme fejl."
GO TO FULL VERSION