"Hej, Amigo! Låt oss fortsätta att prata om misstag. Den här gången kommer vi att utforska misstag som kompilatorn inte alltid hjälper dig med. Var uppmärksam så lär du dig något om dig själv."
"Jag är redo att lyssna, Diego. Jag hoppas att det här inte blir för pinsamt för mig."
Jämföra objekt med==
"Vår lista över mest populära misstag för nybörjarprogrammerare börjar med att jämföra objekt (särskilt strängar) med operatorn ==
"
Exempel:
Scanner console = new Scanner(System.in);
String s1 = console.nextLine();
String s2 = console.nextLine();
if (s1 == s2)
{
System.out.println("The strings are equal");
}
"Jag har gjort det ganska ofta. Nu kan jag tydligt se att den här koden aldrig kommer att visa "Strängarna är lika", eftersom uttalandet if
jämför referenser till två olika strängobjekt."
"Ja. Det är därför det korrekta alternativet skulle vara:
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");
}
Ändra ett String
objekt
"Nybörjare programmerare glömmer ofta att alla objekt i klassen är oföränderliga , och att varje metod i String
klassen returnerar ett nytt objekt - det aktuella objektet ändras aldrig."
"Det var inte så länge sedan jag lärde mig vad oföränderligt betyder, men jag tror att jag har gjort det här.
"Jag är ganska säker på det. Exempel:
String s = "Hello";
s.toUpperCase (); // Convert to uppercase
"Den här koden är väldigt lik korrekt kod, men den kommer inte att fungera som förväntat. Metoden toUpperCase()
ändrar inte objektet som den anropas på. Rätt kod skulle se ut så här:
String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase
"Precis. Jag har gjort det, men jag förstod inte ens riktigt vad som var fel. Tack för förtydligandet!"
Att glömma att initiera objekt som är element i en array
"Ett annat vanligt misstag är att glömma att initiera en arrayvariabel. Exempel:
int[] array;
array[0] = 1;
array[0] = 2;
"Den här koden fungerar inte: du måste uttryckligen ställa in arrayvariabeln lika med en referens till containerobjektet som kommer att lagra elementen i arrayen. Korrekt version:
int[] array = new int[10];
array[0] = 1;
array[0] = 2;
Använder en lokal variabel istället för en instansvariabel.
"Nybörjare gillar inte att komma på långa och meningsfulla namn för variabler."
"Det är så sant. För att få saker gjorda snabbt ger jag ibland variabler namn som , , a
och b
. i
"
"Gör inte det. Det är en grym sak att göra när koden har flera sådana variabler:
Sätt siffran 99 i 100 celler i en array |
---|
|
"Det är mycket svårare att göra fel i kod med egennamn. Den korrekta versionen ser ut så här:
Sätt siffran 99 i 100 celler i en array |
---|
|
Ta bort ett samlingsobjekt
"Har du redan tittat på samlingar?"
"Bokstavligen med bara ett öga."
"Om du inte vet vad jag pratar om, gör då en anteckning till dig själv för att ta en titt i framtiden. Mycket ofta finns det situationer när ett visst element måste tas bort från en samling. Koden ser ungefär ut som detta:
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);
"Den här koden kommer inte att fungera, eftersom du inte kan använda en for-each
loop för att samtidigt gå igenom elementen i en samling och modifiera den samlingen.
"Det finns flera lösningar. Först kan du gå igenom en samling och ändra en annan:
Lösning 1 |
---|
|
"För det andra, sedan Java 8, har samlingar en removeIf()
metod till vilken du kan skicka en regel (lambda-funktion) som anger vilka element som ska tas bort. Exempel:
Lösning 2 |
---|
|
Placera flera klasser med public
modifieraren i en enda fil
"Det kan bara finnas en offentlig klass i en fil. Fler klasser kan deklareras i en fil, men de måste antingen vara inre klasser av en offentlig klass eller inte ha modifieraren. Exempel public
:
Innehållet i filen Solution.java | Notera |
---|---|
|
Detta är inte tillåtet: två offentliga klasser i en enda fil. |
|
Men du kan göra det här. Huvudklassen är inte offentlig |
|
Och du kan göra detta. Huvudklassen är en kapslad klass |
Anropar vanliga (icke-statiska) metoder för en klass från den statiska main()
metoden
"Ibland försöker nybörjarprogrammerare få tillgång till icke-statiska variabler och metoder från main()
metoden eller andra statiska metoder. Sådan kod kommer naturligtvis inte att fungera.
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 bara referera till statiska metoder/variabler. Tja, eller så måste den först skapa en instans av klassen Solution
och först sedan anropa icke-statiska metoder för det objektet. Exempel:
Lösning 1 | Lösning 2 |
---|---|
|
|
Deklarera en konstruktor som en metod
"Ett annat vanligt misstag är att felaktigt deklarera en klasskonstruktor. Namnet på en konstruktor måste vara detsamma som klassens namn, och en konstruktor har ingen resultattyp. De vanligaste misstagen ser ut så här:
|
Det borde inte finnas någon returtyp här |
|
Konstruktornamnet är ogiltigt. Det måste matcha klassnamnet |
|
this saknas. Variabeln value kommer att tilldelas sig själv |
|
Det är allt korrekt. |
Felaktigt arv av gränssnitt
"Javas skapare försökte göra det väldigt nära engelska, så de valde olika nyckelord för vissa relaterade koncept.
När en klass ärver en klass måste du använda nyckelordet extends
:
class Pet
{
}
class Cat extends Pet
{
}
"När en klass ärver ett gränssnitt, eller, mer exakt, implementerar det, måste du använda nyckelordet implements
:
interface Meow
{
}
class Cat implements Meow
{
}
"När ett gränssnitt ärver ett gränssnitt, använd extends
nyckelordet:
interface Meow
{
}
interface Voice extends Meov
{
}
Utelämnar break
i ett switch
uttalande
"Och det sista misstaget för idag, men inte det sista för nybörjare, är att inte inkludera ett break
uttalande i ett switch
uttalande. Exempel:
Fel | Höger |
---|---|
|
|
"Du vet, Diego... Att döma av den uppsättning fel du presenterade här, känns det som att du har läst min personliga dagbok... Eller så har du sett mig lösa uppgifter."
"Ha! Tvivla inte på det. Jag har läst, spårat och fortsätter att göra det. Så var på alerten!"
"???"
"Oroa dig inte. Jag skojar bara. Var vaksam och gör färre dumma misstag."
GO TO FULL VERSION