"Hei, Amigo! La oss fortsette å snakke om feil. Denne gangen skal vi utforske feil som kompilatoren ikke alltid vil hjelpe deg med. Vær oppmerksom og du vil lære noe om deg selv."

"Jeg er klar til å lytte, Diego. Jeg håper dette ikke blir for pinlig for meg."

Sammenligne objekter med==

"Vår liste over favorittprogrammererfeil for nybegynnere begynner med å sammenligne objekter (spesielt strenger) ved å bruke operatøren =="

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

"Jeg har gjort det ganske ofte. Nå kan jeg tydelig se at denne koden aldri vil vise "Stringene er like", fordi setningen ifsammenligner referanser til to forskjellige strengobjekter."

"Ja. Det er derfor det riktige alternativet ville 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");
}

Endre et Stringobjekt

"Nybegynnerprogrammerere glemmer ofte at alle objekter i klassen er uforanderlige , og at hver metode i Stringklassen returnerer et nytt objekt - det nåværende objektet endres aldri."

«Det var ikke så lenge siden jeg lærte hva uforanderlig betyr, men jeg tror jeg har gjort dette.

"Jeg er ganske sikker på det. Eksempel:

String s = "Hello";
s.toUpperCase (); // Convert to uppercase

"Denne koden er veldig lik riktig kode, men den vil ikke fungere som forventet. Metoden toUpperCase()endrer ikke objektet den kalles på. Den riktige koden vil se slik ut:

String s = "Hello";
String result = s.toUpperCase(); // Convert to uppercase

"Akkurat. Jeg har gjort det, men jeg skjønte ikke engang hva som var galt. Takk for oppklaringen!"

Glemte å initialisere objekter som er elementer i en matrise

"En annen vanlig feil er å glemme å initialisere en matrisevariabel. Eksempel:

int[] array;
array[0] = 1;
array[0] = 2;

"Denne koden vil ikke fungere: du må eksplisitt sette array-variabelen lik en referanse til beholderobjektet som vil lagre elementene i arrayen. Riktig versjon:

int[] array = new int[10];
array[0] = 1;
array[0] = 2;

Bruke en lokal variabel i stedet for en forekomstvariabel.

"Nybegynnere liker ikke å komme opp med lange og meningsfulle navn på variabler."

"Det er så sant. For å få ting gjort raskt, gir jeg noen ganger variabler navn som a, b, og i."

"Ikke gjør det. Det er en grusom ting å gjøre når koden har flere slike variabler:

Sett tallet 99 inn i 100 celler i en matrise
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 mye vanskeligere å gjøre feil i kode med egennavn. Den riktige versjonen ser slik ut:

Sett tallet 99 inn i 100 celler i en matrise
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;
      }
   }
}

Fjerning av et samleobjekt

"Har du allerede sett på samlinger?"

"Bokstavelig talt med bare ett øye."

"Hvis du ikke vet hva jeg snakker om, så noter deg selv for å ta en titt i fremtiden. Svært ofte er det situasjoner når et bestemt element må fjernes fra en samling. Koden ser omtrent ut som dette:

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 koden vil ikke fungere, fordi du ikke kan bruke en for-eachløkke til å krysse elementene i en samling samtidig og endre den samlingen.

"Det er flere løsninger. Først kan du gå gjennom en samling og endre en annen:

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 andre, siden Java 8, har samlinger en removeIf()metode som du kan sende en regel (lambda-funksjon) til som indikerer hvilke elementer som 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 );

Plassering av flere klasser med publicmodifikatoren i en enkelt fil

"Det kan bare være én offentlig klasse i en fil. Flere klasser kan deklareres i en fil, men de må enten være indre klasser av en offentlig klasse, eller ikke ha modifikatoren. Eksempel public:

Innholdet i Solution.java-filen Merk
public class Solution
{
}
public class Main
{
}
Dette er ikke tillatt: to offentlige klasser i en enkelt fil.
public class Solution
{
}
class Main
{
}
Men du kan gjøre dette. Hovedklassen er ikke offentlig
public class Solution
{
  public static class Main
  {
  }
}
Og du kan gjøre dette. Hovedklassen er en nestet klasse

Kaller vanlige (ikke-statiske) metoder for en klasse fra den statiske main()metoden

"Noen ganger prøver nybegynnere programmerere å få tilgang til ikke-statiske variabler og metoder fra metoden main()eller andre statiske metoder. Slik 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 bare referere til statiske metoder/variabler. Vel, eller så må den først opprette en forekomst av klassen Solution, og først deretter kalle ikke-statiske metoder for det objektet. 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ære en konstruktør som en metode

"En annen vanlig feil er å feil deklarere en klassekonstruktør. Navnet på en konstruktør må være det samme som navnet på klassen, og en konstruktør har ingen resultattype. De vanligste feilene ser slik ut:

public class Person
{
   private String value;

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

   constructor(String value)
   {
      this.value = value;
   }
}
Konstruktørnavnet er ugyldig. Det må samsvare med klassenavnet
public class Person
{
   private String value;

   Person(String value)
   {
      value = value;
   }
}
this mangler. Variabelen valuevil bli tildelt seg selv
public class Person
{
   private String value;

   Person(String value)
   {
      this.value = value;
   }
}
Det er alt riktig.

Feil nedarving av grensesnitt

"Javas skapere prøvde å gjøre det veldig nært engelsk, så de valgte forskjellige nøkkelord for visse relaterte konsepter.

Når en klasse arver en klasse, må du bruke nøkkelordet extends:

class Pet
{
}

class Cat extends Pet
{
}

"Når en klasse arver et grensesnitt, eller mer presist, implementerer det, må du bruke nøkkelordet implements:

interface Meow
{
}

class Cat implements Meow
{
}

"Når et grensesnitt arver et grensesnitt, bruk nøkkelordet extends:

interface Meow
{
}

interface Voice extends Meov
{
}

Utelater breaki en switchuttalelse

"Og den siste feilen for i dag, men ikke den siste for nybegynnere, er å ikke inkludere en breakuttalelse i en switchuttalelse. Eksempel:

Feil Ikke sant
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... Å dømme etter settet med feil du presenterte her, føles det som om du har lest min personlige dagbok... Eller du har sett meg løse oppgaver."

"Ha! Ikke tvil om det. Jeg har lest, sporet og fortsetter å gjøre det. Så vær på vakt!"

"???"

"Ikke bekymre deg. Jeg bare tuller. Vær på vakt og gjør færre dumme feil."