"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 ifjä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 Stringobjekt

"Nybörjare programmerare glömmer ofta att alla objekt i klassen är oföränderliga , och att varje metod i Stringklassen 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 , , aoch 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
class Solution
{
  public static int a = 99;
  public static int i = 100;

  public static void main(String[] args)
  {
    int[] a = new int[i];
    for (int i = 0; i < 10; i++)
    {
      a[i] = a;
    }
  }
}

"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
class Solution
{
   public static int value = 99;
   public static int count = 100;

   public static void main(String[] args)
   {
      int[] a = new int[count];
      for (int i = 0; i < 10; i++)
      {
         a[i] = value;
      }
   }
}

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-eachloop 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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

ArrayList<Integer> copy = new ArrayList<Integer>(list);
for (Integer value: copy)
   if (value < 0)
      list.remove(value);

"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
ArrayList<Integer> list = new ArrayList<Integer>();
Collections.addAll(list, 0, -5, -7, -12, 5, 15);

list.removeIf( x-> x<0 );

Placera flera klasser med publicmodifieraren 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
public class Solution
{
}
public class Main
{
}
Detta är inte tillåtet: två offentliga klasser i en enda fil.
public class Solution
{
}
class Main
{
}
Men du kan göra det här. Huvudklassen är inte offentlig
public class Solution
{
  public static class Main
  {
  }
}
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();
   }
}

" mainMetoden kan bara referera till statiska metoder/variabler. Tja, eller så måste den först skapa en instans av klassen Solutionoch först sedan anropa icke-statiska metoder för det objektet. Exempel:

Lösning 1 Lösning 2
public class Solution
{
  public static int n = 100;

  public static int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    int[] array = createArray();
  }
}
public class Solution
{
  public int n = 100;

  public int[] createArray()
  {
    return new int[n];
  }

  public static void main(String[]args)
  {
    Solution sol = new Solution();
    int[] array = sol.createArray();
  }
}

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:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
Det borde inte finnas någon returtyp här
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
Konstruktornamnet är ogiltigt. Det måste matcha klassnamnet
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this saknas. Variabeln valuekommer att tilldelas sig själv
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
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 extendsnyckelordet:

interface Meow
{
}

interface Voice extends Meov
{
}

Utelämnar breaki ett switchuttalande

"Och det sista misstaget för idag, men inte det sista för nybörjare, är att inte inkludera ett breakuttalande i ett switchuttalande. Exempel:

Fel Höger
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
   case TUESDAY:
      System.out.println("Tuesday");
   case WEDNESDAY:
      System.out.println("Wednesday");
   case THURSDAY:
      System.out.println("Thursday");
   case FRIDAY:
      System.out.println("Friday");
   case SATURDAY:
      System.out.println("Saturday");
   case SUNDAY:
      System.out.println("Sunday");
}
LocalDate date = LocalDate.now();
DayOfWeek day = date.getDayOfWeek();
switch (day)
{
   case MONDAY:
      System.out.println("Monday");
      break;
   case TUESDAY:
      System.out.println("Tuesday");
      break;
   case WEDNESDAY:
      System.out.println("Wednesday");
      break;
   case THURSDAY:
      System.out.println("Thursday");
      break;
   case FRIDAY:
      System.out.println("Friday");
      break;
   case SATURDAY:
      System.out.println("Saturday");
      break;
   case SUNDAY:
      System.out.println("Sunday");
      break;
}

"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."