"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 ifsammenligner 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 Stringobjekt

"Nybegyndere programmører glemmer ofte, at alle objekter i klassen er uforanderlige , og at hver metode i Stringklassen 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
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 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
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;
      }
   }
}

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-eachloop 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
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);

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

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

Placering af flere klasser med publicmodifikatoren 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. publicEksempel:

Indholdet af filen Solution.java Bemærk
public class Solution
{
}
public class Main
{
}
Dette er ikke tilladt: to offentlige klasser i en enkelt fil.
public class Solution
{
}
class Main
{
}
Men du kan gøre dette. Hovedklassen er ikke offentlig
public class Solution
{
  public static class Main
  {
  }
}
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();
   }
}

" mainMetoden kan kun henvise til statiske metoder/variabler. Tja, eller den skal først oprette en instans af klassen Solutionog først derefter kalde ikke-statiske metoder for det objekt. Eksempel:

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();
  }
}

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:

public class Person
{
   private String value;

   void Person(String value)
   {
      this.value = value;
   }
}
Der burde ikke være en returtype her
public class Person
{
   private String value;

   constructor(String value)
   {
      this.value = value;
   }
}
Konstruktørnavnet er ugyldigt. Det skal matche klassenavnet
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this mangler. Variablen valuevil blive tildelt sig selv
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
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 breaki en switcherklæring

"Og den sidste fejl for i dag, men ikke den sidste for begyndere, er at undlade at inkludere en breakerklæring i en switcherklæring. Eksempel:

Forkert Højre
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 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."