Archief - Java, wat is er mis?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

.TiTipower

Legacy Member
Beste,
Heb morgen examen en heb als voorbeeld een oefening gemaakt maar hij geeft een error bij: "hoogstenaam" in de derde laatste regel

Iemand enig idee wat ik fout heb gedaan?

Alvast bedankt:


Code:
public class vraag12 {
   public static void main(String args[]){
   int [] aantal = new int [7];
   String [] allergie = new String [7];
   allergie[0] = "huisstofmijt";
   allergie[1] = "boompollen";
   allergie[2] = "graspollen";
   allergie[3] = "honden";
   allergie[4] = "katten";
   allergie[5] = "knaagdieren";
   allergie[6] = "schimmels";
    int totaantal =0, hoogsteaantal=0, code,aantalperpersoon;
    String hoogstenaam, naam;
    double perc;
    naam = Invoer.leesString("Geef naam in");
    while (!(naam.equals("xx"))) {
        totaantal++;
        code = Invoer.leesInt("Geef de code in");
        aantalperpersoon = 0;
        while (code != 9){
	   aantal[code-1] = aantal[code-1]+1;
                aantalperpersoon = aantalperpersoon+1;
	    code = Invoer.leesInt("Geef de code in");
	} 
         if (aantalperpersoon > hoogsteaantal){
	hoogsteaantal = aantalperpersoon;
	hoogstenaam = naam;
            }
         naam = Invoer.leesString("Geef naam in");
	}
         System.out.println("totaal aantal patiënten opgenomen in het onderzoek: " + totaantal);
          for (int i=1; i<=6;i++){
	  perc = aantal[i]/totaantal*100.0;
	  System.out.println("Aantal allergiesch voor "+allergie[i]+" "+aantal[i]+"dit is "+perc+"%");
		}
          System.out.println("de meest allergische persoon is" +[COLOR="Red"]hoogstenaam[/COLOR]);
	    }
	}

forloRn_

Legacy Member
Code:
The local variable hoogstenaam may not have been initialized

Ik denk dat het wilt zeggen dat de variabele hoogstenaam mogelijk niet geïnitialiseerd is...

't Is heel simpel: je declareert een variabele maar je kent er geen waarde aan toe, terwijl je hem op het einde toch wilt printen. In C/C++ gaat dat lukken en krijg je een scherm vol met garbage te zien; Java wilt de programmeur beschermen en zegt hem dat het programma in sommige gevallen toch niet gaat werken, dus weigert de compiler het te compileren.

Declareer je variabele als volgt:
Code:
String hoogstenaam = null;

design1

Legacy Member
Welke richting doe je wel en waar precies?
Succes alvast

.TiTipower

Legacy Member
design1 zei:
Welke richting doe je wel en waar precies?
Succes alvast

Ik volg toegepaste informatica op de PHL in Hasselt. 1ste jaar wel te verstaan :)

Examen is zeer goed verlopen dus ik ben tevreden :niceone:

Jack

Legacy Member
forloRn_ zei:
Code:
The local variable hoogstenaam may not have been initialized

Ik denk dat het wilt zeggen dat de variabele hoogstenaam mogelijk niet geïnitialiseerd is...

't Is heel simpel: je declareert een variabele maar je kent er geen waarde aan toe, terwijl je hem op het einde toch wilt printen. In C/C++ gaat dat lukken en krijg je een scherm vol met garbage te zien; Java wilt de programmeur beschermen en zegt hem dat het programma in sommige gevallen toch niet gaat werken, dus weigert de compiler het te compileren.

Declareer je variabele als volgt:
Code:
String hoogstenaam = null;

zijn declaratie "String hoogestenaam" is hetzelfde als "String hoogstenaam = null", namelijk een ongeinitialiseerd object heeft altijd null als pointer waarde.

String hoogstenaam = ""; zou al beter zijn

Parnakra

Legacy Member
Jack zei:
zijn declaratie "String hoogestenaam" is hetzelfde als "String hoogstenaam = null", namelijk een ongeinitialiseerd object heeft altijd null als pointer waarde.

String hoogstenaam = ""; zou al beter zijn
Neen.

Jack

Legacy Member
Parnakra zei:

Verklaar u nader zou ik zeggen, mijn voorstel is een veel gebruike programming practice, in de trend van binnen een methode bijv "int a = 0" te zetten om te definieren en te initialiseren.

Parnakra

Legacy Member
Jack zei:
Verklaar u nader zou ik zeggen, mijn voorstel is een veel gebruike programming practice, in de trend van binnen een methode bijv "int a = 0" te zetten om te definieren en te initialiseren.
Een ongeïnitialiseerd object heeft nooit null als waarde, aangezien een ongeïnitialiseerd object geen waarde heeft. Daarom is het ongeïnitialiseerd. :)

Als je eender welk object de waarde null geeft, dan vermijd je de fout die zich in dit geval voordeed. (variable may not have been initialized)

j design

Legacy Member
Om fouten te vermijden ben je best steeds alle waardeb te initialiseren op 0.
Andere talen initialiseren op vreemde waarden. Normalerhand java op 0.

String hoogstenaam moet nog aangemaakt worden als ik me niet vergis.

String s = new String();

Beetje vreemde manier. Heb je daarvoor de methoden van school gekregen?
.leesString

Verder moet je zeker letten op de structuur van je file. Iets meer orde.
Als je dan grotere programmas gaat schrijven komt je dat alleen ten goede.

Vermijd ook langere stukken code (is natuurlijk niet fout)
zoals a=a+1 is kortweg a++

Kan je de opgave eens geven?

dit is al een pak beter, al werken de percenten nog niet volledig
Code:
import java.util.Scanner;

public class test 
{
   public static void main(String args[])
   	{
   		Scanner sc = new Scanner(System.in);
   		
	    int totaantal =0, hoogsteaantal=0, code=0, aantalperpersoon=0;
	    String hoogstenaam= new String();
	    String naam= new String();
	    double perc=0;

	   int [] aantal = new int [7];
	   
	   String [] allergie = new String [7];
	   allergie[0] = "huisstofmijt";
	   allergie[1] = "boompollen";
	   allergie[2] = "graspollen";
	   allergie[3] = "honden";
	   allergie[4] = "katten";
	   allergie[5] = "knaagdieren";
	   allergie[6] = "schimmels";
	   
	    
	    System.out.println("Geef naam in: ");
	    naam = sc.next();
	    
	    while (!(naam.equals("xx"))) 
	    	{
		        totaantal++;
		        System.out.println("Geef de code in");
		        code = sc.nextInt();
		        
		        aantalperpersoon = 0;
		        
		        while (code != 9)
		        	{
					   aantal[code-1] = aantal[code-1]+1;
				       aantalperpersoon++;
				       
				       System.out.println("Geef de code in");
					   code = sc.nextInt();
					} 
				
	         if (aantalperpersoon > hoogsteaantal)
	         	{
					hoogsteaantal = aantalperpersoon;
					hoogstenaam = naam;
	            }
	            
	            System.out.println("Geef naam in");
	        	naam = sc.next();
			}	
				
	         System.out.println("totaal aantal patiënten opgenomen in het onderzoek: " + totaantal);
	         
	          for (int i=1; i<=6;i++)
	          	{
				  perc = aantal[i]/totaantal*100.0;
				  System.out.println("Aantal allergiesch voor "+allergie[i]+" "+aantal[i]+"dit is "+perc+"%");
				}
				
	          System.out.println("de meest allergische persoon is" +hoogstenaam);
	    }
	}

Parnakra

Legacy Member
j design zei:
Andere talen initialiseren op vreemde waarden. Normalerhand java op 0.
Java doet dit niet voor lokale variabelen. (waar we hier mee te maken hebben)

/edit: om alle verwarring te vermijden, als je String x = new String(); doet gaat x inderdaad standaard een null-waarde meekrijgen (of een lege string, zou ik eens moeten nakijken - maar komt op hetzelfde neer) omdat de constructor het string-object initialiseert.

j design

Legacy Member
Java doet dit niet voor lokale variabelen. (waar we hier mee te maken hebben)

/edit: om alle verwarring te vermijden, als je String x = new String(); doet gaat x inderdaad standaard een null-waarde meekrijgen (of een lege string, zou ik eens moeten nakijken - maar komt op hetzelfde neer) omdat de constructor het string-object initialiseert.

Zonder met je in discussie te gaan,
volgens mijn prof wordt in java alles geinitialiseerd op 0.
Ik heb er zelf nog niet echt op gelet, ik initialiseer alles steeds zelf.

Over een null gelijk zetten aan een lege string kan ik niet met akkoord gaan.
De nullpointer wijst naar een onbestaand element. Een lege string is er wel degelijk, er staat gewoon niets in.

Maar dat is enkel muggeziften dat maar in bepaalde situaties er toe doet.

Parnakra

Legacy Member
j design zei:
Zonder met je in discussie te gaan,
volgens mijn prof wordt in java alles geinitialiseerd op 0.
Ik heb er zelf nog niet echt op gelet, ik initialiseer alles steeds zelf.
Dan is je prof mis of heb je een nuance niet gehoord.

Je kan het gerust zelf proberen. Maak een dummyklasse met een string-attribuut, maak die klasse aan en print het attribuut, je zal 'null' te zien krijgen. Als je echter een methode maakt (bv. print() ) waarin je lokaal een string declareert (maar niet initialiseert) en probeert af te printen, zal je een fout krijgen.

En dit soort dingen valt niet onder mierenneuken, imo. Als je over programmeren bezig bent dien je het verschil te kennen tussen declareren en initialiseren en hoe verschillende talen daarmee omgaan.

Dat gezegd zijnde, het gaat inderdaad wat ver van het originele onderwerp. :)

Cycloon

Legacy Member
Het heeft echt géén nut om een string op "" te initialiseren omdat de string klasse immutable is. Het komt er dus op neer dat bij elke actie waarbij de string verandert (bv een letter toevoegen) sowieso een nieuw object wordt aangemaakt. Je kan een leeg string object dus best altijd op null initialiseren.

j design

Legacy Member
Even een verbetering aanbrengen:
volgens mijn prof wordt in java wat met getallen te maken heeft geinitialiseerd op 0 door java zelf.
Dit lijkt er beter op.

Over de String vraag ik het hem maandag nog eens.
Nu terug ontopic :)

Parnakra

Legacy Member
j design zei:
Even een verbetering aanbrengen:
volgens mijn prof wordt in java wat met getallen te maken heeft geinitialiseerd op 0 door java zelf.
Dit lijkt er beter op.
Het is nog steeds fout en/of onvolledig, hoor. Hier geldt exact hetzelfde - immers, hoe kan java onderscheid maken tussen 'iets dat met getallen te maken heeft' en iets anders? Java kent enkel objecten en primitieven, daar hebben 'getallen' zoals wij ze kennen niets mee te zien.

Code:
public class Foo {
    private int intA;
    private Integer integerA;

    public Foo() { }

    public void bar() {
        int intB;
        Integer integerB;
        System.out.println("intA: " + intA);
        System.out.println("integerA: " + integerA);
        System.out.println("intB: " + intB);
        System.out.println("integerB: " + integerB);
    }
}

Probeer het maar eens uit. De attributen worden geïnitialiseerd wanneer je de constructor oproept, maar de lokale variabelen geven een fout/waarschuwing. (zowel de primitieve int als het integerobject, 2 dingen die 'met getallen te maken hebben')

r2d3

Legacy Member
die is null , daar hoef je geen prof voor te zijn .Dat kan je best zelf checken ;)

Code:
public class TestMain {
	static String s;

	public static void main(String[] args) {
		System.out.println(s);
	}
}

Parnakra

Legacy Member
r2d3 zei:
die is null , daar hoef je geen prof voor te zijn .Dat kan je best zelf checken ;)
Lees even de volledige topic. Er is een verschil tussen lokale variabelen en attributen.

forloRn_

Legacy Member
Ik heb de String op null geïnitialiseerd omwille van de reden die Cycloon aanhaalde en voor de rest moet je maar naar Parnakra luisteren, behalve voor dit dan:

als je String x = new String(); doet gaat x inderdaad standaard een null-waarde meekrijgen (of een lege string, zou ik eens moeten nakijken - maar komt op hetzelfde neer)
:)

Emerxill

Legacy Member
Parnakra zei:
/edit: om alle verwarring te vermijden, als je String x = new String(); doet gaat x inderdaad standaard een null-waarde meekrijgen (of een lege string, zou ik eens moeten nakijken - maar komt op hetzelfde neer) omdat de constructor het string-object initialiseert.
Em gaat dan een lege char sequence maken (new char[0]). Dus eigenlijk hetzelfde als String s = "".
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan