Variabele is mogelijk niet geïnitialiseerd fout

Als ik dit probeer te compileren:

public static Rand searchCount (int[] x)
{
    int a ;
    int b ;
    ...
    for (int l= 0; l<x.length; l++)
    {
        if (x[l] == 0)
        a++ ;
        else if (x[l] == 1)
        b++ ;
    }
    ...
}

Ik krijg deze fouten:

Rand.java:72: variable a might not have been initialized
                a++ ;
                ^
Rand.java:74: variable b might not have been initialized
                b++ ;
                ^
2 errors

Het lijkt mij dat ik ze bovenaan de methode heb geïnitialiseerd. Wat gaat er mis?


Antwoord 1, autoriteit 100%

Je hebt ze gedeclareerd, maar je hebt ze niet geïnitialiseerd. Als u ze initialiseert, stelt u ze gelijk aan een waarde:

int a;        // This is a declaration
a = 0;        // This is an initialization
int b = 1;    // This is a declaration and initialization

Je krijgt de foutmelding omdat je de variabelen niet hebt geïnitialiseerd, maar ze verhoogt (bijvoorbeeld a++) in de for-lus.

Java-primitieven hebben standaardwaarden, maar zoals een gebruiker hieronder heeft opgemerkt

Hun standaardwaarde is nul wanneer gedeclareerd als klasseleden. Lokale variabelen hebben geen standaardwaarden


Antwoord 2, autoriteit 76%

Lokale variabelen krijgen geen standaardwaarden. Hun initiële waarden zijn niet gedefinieerd zonder op de een of andere manier waarden toe te kennen. Voordat u lokale variabelen kunt gebruiken, moeten ze worden geïnitialiseerd.

Er is een groot verschil wanneer je een variabele declareert op klasseniveau (als lid, dus als veld) en op methodeniveau.

Als je een veld op klasseniveau declareert, krijgen ze standaardwaarden volgens hun type. Als u een variabele declareert op methodeniveau of als een blok (betekent een willekeurige code binnen {}), krijgt u geen waarden en blijft u ongedefinieerd totdat ze op de een of andere manier enkele beginwaarden krijgen, dwz enkele waarden die eraan zijn toegewezen.


Antwoord 3, autoriteit 8%

Als ze werden gedeclareerd als velden van de klasse, zouden ze echt worden geïnitialiseerd met 0.

Je bent een beetje in de war, want als je schrijft:

class Clazz {
  int a;
  int b;
  Clazz () {
     super ();
     b = 0;
  }
  public void printA () {
     sout (a + b);
  }
  public static void main (String[] args) {
     new Clazz ().printA ();
  }
}

Dan zal deze code “0” afdrukken. Dit komt omdat er een speciale constructor wordt aangeroepen wanneer u een nieuwe instantie van Clazz maakt. Eerst wordt super ()aangeroepen, daarna wordt veld aimpliciet geïnitialiseerd en vervolgens wordt regel b = 0uitgevoerd.


Antwoord 4, autoriteit 4%

Je hebt ze aangegeven, maar niet geïnitialiseerd.

int a; // declaration, unknown value
a = 0; // initialization
int a = 0; // declaration with initialization

Antwoord 5, autoriteit 3%

Je hebt ze gedeclareerd, maar je hebt ze niet geïnitialiseerd met een waarde. Voeg zoiets als dit toe:

int a = 0;

Antwoord 6, autoriteit 3%

Je hebt ze gedeclareerd, maar ze hebben geen initiële waarde gegeven – ze zijn dus niet-geïnitialiseerd. Probeer iets als:

public static Rand searchCount (int[] x)  
{ 
  int a = 0 ;  
  int b = 0 ; 

en de waarschuwingen zouden moeten verdwijnen.


7, Autoriteit 2%

U hebt ze aan het begin van de methode verklaard, maar u hebt ze nooit geïnitialiseerd. Initialiseren zou ze gelijk zijn aan een waarde, zoals:

int a = 0;
int b = 0;

8, Autoriteit 2%

Stel je voor wat er gebeurt als x [L] noch 0 noch 1 in de lus is. In dat geval zullen A en B nooit worden toegewezen aan en een ongedefinieerde waarde hebben.
U moet ze allebei met enige waarde initialiseren, bijvoorbeeld 0.


9, Autoriteit 2%

Het is een goede praktijk om de lokale variabelen in het werktuigblok te initialiseren voordat u het gebruikt. Hier is een vergissing die een beginner kan committeren.

 public static void main(String[] args){
    int a;
    int[] arr = {1,2,3,4,5};
    for(int i=0; i<arr.length; i++){
        a = arr[i];
    }
    System.out.println(a);
  }

Je mag verwachten dat de console ‘5’ zal tonen, maar in plaats daarvan zal de compiler de fout ‘variabele a wordt mogelijk niet geïnitialiseerd’ geven. Hoewel je zou kunnen denken dat variabele a is ‘geïnitialiseerd’ in de for-lus, denkt de compiler niet op die manier. Wat als arr.length0 is? De for-lus wordt helemaal niet uitgevoerd. Daarom geeft de compiler variable a might not have been initializedom op het potentiële gevaar te wijzen en u te vragen de variabele te initialiseren.

Om dit soort fouten te voorkomen, initialiseert u gewoon de variabele wanneer u deze declareert.

int a = 0;

Antwoord 10

Je hebt aen bniet geïnitialiseerd, alleen gedeclareerd. Er is een subtiel verschil.

int a = 0;
int b = 0;

Dit is tenminste voor C++, ik neem aan dat Java hetzelfde concept is.


Antwoord 11

Stel variabele “a” in op een waarde zoals deze,

a=0;

Declareren en initialiseren zijn beide verschillend.

Veel succes

Other episodes