Archief - [JAVA] Illegal start of expression.

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.

Bumbolt

Legacy Member
Code:
/**
     * Tel hoeveel zieke patienten er in de lijst staan. 
     */
    public int numberOfIllAnimals()
    {
        private int counter;
        private int size = patienten.size();
        for(int i = 0 ; i <= size ; i++)
        {
          if(patient.isIll())
            {
                counter++;
            }  
        }
        return counter;
    }

Wat doe ik fout? Ik heb al geprobeerd zonder de methode isIll aan te roepen en de variable size aangemaakt om te zorgen dat die methode ook niet nog eens word opgeroepen in de functie. De error komt bij het begin van de for loop.

De volledige code:
import java.util.ArrayList;


public class Vetrenarian
{
// instance variables - replace the example below with your own
private String veearts;
private ArrayList<Animal> patienten;

private Animal patient;

/**
* Maak een nieuwe lijst aan die de patienten van een veearts bevat.
*/
public Vetrenarian(String veearts)
{
patienten = new ArrayList<Animal>();
this.veearts = veearts;
}

/**
* Maak een nieuwe patient aan.
*/
public void newPatient(String naam, String eigenaar, int leeftijd)
{
patient = new Animal(naam, eigenaar, leeftijd);
patienten.add(patient);
}

/**
* Tel hoeveel zieke patienten er in de lijst staan.
*/
public int numberOfIllAnimals()
{
private int counter;
private int size = patienten.size();
for(int i = 0; i <= size ; i++)
{
if(patient.isIll())
{
counter++;
}
}
return counter;
}

}

Bv202

Legacy Member
In een methode moet je je variabelen niet public/private/protected maken. Die variabelen worden weer verwijderd op het einde van de methode.

Je code doet ook niet echt wat beschreven wordt in je commentaar. Nu bekijk je altijd of de laatst toegevoegde patiënt ziek is, wat niet de bedoeling is. Je moet doorheen de hele lijst met patientën gaan en bij elke patiënt kijken of hij ziek is. Zie:
ArrayList: iterator() : ArrayList « java.util « Java by API

Je for-loop klopt ook niet. Arraylists beginnen met het element 0, de size() methode geeft het aantal elementen terug. Je for-loop zou dus moeten zijn:
for(int i = 0; i < size ; i++)

Correct me if I'm wrong... Java is alweer een tijdje geleden voor mij :p

Gurdt

Legacy Member
Inderdaad, je zal iets willen als:
Code:
for(Animal patient:patienten) {
    if(patient.isIll())
        ++counter;
}

NeverwinterX

Legacy Member
De Iterator van Bv202 en enhanced for loop van Gurdt zijn zeker mogelijkheden. Maar aangezien ik de kans groot acht dat je dat soort constructies nog niet gezien hebt, is hier een eenvoudigere methode:

Code:
    public int numberOfIllAnimals()
    {
        int counter = 0;
        int size = patienten.size();
        Patient huidigePatient;
        for(int i = 0; i < size; i++)
        {
          huidigePatient = patienten.get(i);
          if(huidigePatient.isIll())
            {
                counter++;
            }  
        }
        return counter;
    }

Merk op dat ik zoals Bv202 al zei de eindvoorwaarde van for-loop heb gewijzigd, de "private" van de lokale variabelen heb weggehaald, maar ook dat ik "counter" geinitialiseerd heb op 0. Als je dat laatste niet doet, zal de compiler een error geven.
Je mixt trouwens Engels en Nederlands wat behoorlijk verwarrend is.

Nepherte

Legacy Member
Enkele opmerkingen:
- als je een integer (zoals counter) niet expliciet initialiseert, krijgt deze de waarde 0. Dit geldt voor alle primitieve types die een getal voorstellen (float, double, long, int). De compiler zal hiervoor dus geen error geven (in tegenstelling tot NeverwinterX beweert?), maar het verhoogt wel de leesbaarheid van de code en je geeft hiermee aan dat je er aan gedacht hebt.
- zoals anderen reeds aangegeven hebben moet je geen visibility modifier (in dit geval private) geven aan lokale variabelen zoals je deed voor counter en size. De scope (bereik) van een variabele is hier beperkt tot de methode en zijn niet toegankelijk buiten de methode. Als je de variabele bijvoorbeeld zou declarenen binnenin een loop of while, is deze beperkt tot de loop. Je kan dus perfect Patient huidigePatient in het voorbeeld van NeverwinterX in de loop plaatsen en is in een bepaald opzicht zelfs beter omdat je hierdoor niet het gevaar loopt om nooit huidigePatient te initialiseren en een potentiële nullpointer te veroorzaken.
- Wees consistent in je taalgebruik. Meng geen engels en nederlands door elkaar.
- indexen van arrays, lists, ... beginnen vanaf 0 en lopen dus logischerwijs tot size-1 zoals anderen al aangaven.
- Ik zou geen animal object in vetrenarian aanmaken zoals je doet met newPatient(args). In de plaats geef je een enkel argument Animal mee en voeg je dit ineens toe: public void addPatient(Animal patient) { .... }

forloRn_

Legacy Member
Nepherte zei:
Enkele opmerkingen:
- als je een integer (zoals counter) niet expliciet initialiseert, krijgt deze de waarde 0. Dit geldt voor alle primitieve types die een getal voorstellen (float, double, long, int). De compiler zal hiervoor dus geen error geven (in tegenstelling tot NeverwinterX beweert?), maar het verhoogt wel de leesbaarheid van de code en je geeft hiermee aan dat je er aan gedacht hebt.

Mis. NeverwinterX heeft gelijk: lokale variabelen worden niet geïnitialiseerd en het compileren mislukt als je het zelf niet expliciet doet.

Jerre Muesli

Legacy Member
Der is een verschil in klasse en lokale variabelen.

It's not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or null, depending on the data type.

Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error.

Nepherte

Legacy Member
forloRn_ zei:
Mis. NeverwinterX heeft gelijk: lokale variabelen worden niet geïnitialiseerd en het compileren mislukt als je het zelf niet expliciet doet.
Inderdaad, ik had het mis. Toont wel aan hoe nuttig het is om toch maar al je variabelen te initialiseren :)

MAXXUR

Legacy Member
en nu het probleem opgelost is, gogo met mierenneuken !!!!!!!!!
ik vind dat ge dat nog vééél korter kunt schrijven hoor

MilM

Legacy Member
Korter is daarom niet beter.
Zeker wanneer het om oefeningen gaat om een taal te leren.

Jerre Muesli

Legacy Member
Als ge wilt kunt ge dat met lambdaj op 1 lijn schrijven maja .. overkill

Parnakra

Legacy Member
Code:
Ruby:
patienten.each { |patient| counter += 1 if patient.isSick }
-gooit olie op het vuur-

/edit: of zonder initialisatie van een countervariable:
Code:
puts patienten.find_all { |patient| patient.isSick }.size

forloRn_

Legacy Member
Of met Scala:
val n = patienten.count(_.isIll)

Zelfs met C++:
int n = std::count_if(patienten.begin(), patienten.end(), std::mem_fun(&Patient::isIll));

Parnakra

Legacy Member
Dan vind ik de Ruby-versies nog iets leesbaarder. Maar ik geef gerust toe dat ik biased ben. :)

En die Scala lijkt inderdaad ook leuk, ga ik me toch ook eens in moeten verdiepen.

Parnakra

Legacy Member
Heb je het nu over Ruby, Scala of C++?

Van die drie vind ik zowel Ruby en Scala véél leesbaarder dan die klomp java-code en C++ is inherent overladen met operators en identifiers.

Persoonlijk (en echt subjectief is dit niet) vind ik Ruby één van de meest leesbare programmeertalen die er zijn. Het leest zelfs beter dan de gemiddelde Harry Potter histoire.

Om dat meteen met Brainfuck te gaan vergelijken (die an sich gewoon een experiment is), vind ik er wat over gaan.

NeverwinterX

Legacy Member
Parnakra zei:
Heb je het nu over Ruby, Scala of C++?

Van die drie vind ik zowel Ruby en Scala véél leesbaarder dan die klomp java-code en C++ is inherent overladen met operators en identifiers.

Persoonlijk (en echt subjectief is dit niet) vind ik Ruby één van de meest leesbare programmeertalen die er zijn. Het leest zelfs beter dan de gemiddelde Harry Potter histoire.

Om dat meteen met Brainfuck te gaan vergelijken (die an sich gewoon een experiment is), vind ik er wat over gaan.

De ruby versie vind ik het minst leesbaar (en C++, maar goed die taal is al wat ouder en heel performant, dus daar ben ik mild voor :p).
Onlangs wou ik nog deze ruby code proberen en begrijpen: Morse Code Translator in Ruby | Saalon Muyo
Man wat is me dat. Java leest bijna als Engels, Ruby als Chinees.

Veel script talen en zeker functionele talen hebben die neiging. Die willen altijd maar voor alles speciale symbolen gebruiken. Ook weer Java nu: de syntax in het lambda proposal voor java 8 gebruikt momenteel het symbool # (verandert mogelijk nog, momenteel houden ze zich nog niet bezig met syntax). Er gingen stemmen op voor het gebruik van gewoon een keyword "lambda" (hoewel ze zich daar nog niet mee mogen bezighouden :p) en ik ben het daar eigenlijk mee eens.

Parnakra

Legacy Member
Dat is dan ook niet meteen een perfect voorbeeld van hoe de Ruby syntax te gebruiken (hoewel het simpel genoeg is om sowieso geen problemen te geven - had je hier écht moeite mee?).

Ik raad je zeker dit boek aan. Het is misschien niet iedereen z'n ding (de hyperactiviteit van de auteur en soms wat bizarre verhaallijnen), maar hij beschrijft wel de taal op zo'n manier dat zelfs iemand die (vrijwel) geen programmeerervaring heeft simpele code zou kunnen ontcijferen (en misschien zelfs zelf schrijven).

Eens ik aan Ruby gewend was, had ik moeite om terug naar Java/C#/zowat elke andere taal terug te keren. Daar zit je soms 2 minuten op anderhalve pagina code te kijken om dan te beseffen dat het iets dat je in Ruby in 2 of 3 lijnen/bijna zinnen kan schrijven.

/edit: en wat speciale symbolen betreft: zowat het enige 'speciale' symbool in Ruby (specifiek in het programma dat je linkt) is de concatenator (<<). Al de rest is gelijklopend met andere talen en de enkele toevoegingen (? en ! bij methodes) voelen zéér natuurlijk aan in gebruik.

Tyfius

Legacy Member
Puur voor de volledigheid de C# mogelijkheid even vermelden en dan verdwijn ik uit dit topic.

Code:
return patienten.Where(p => p.IsIll).Count();

:p

Krueger

Legacy Member
Tyfius zei:
Puur voor de volledigheid de C# mogelijkheid even vermelden en dan verdwijn ik uit dit topic.

Code:
return patienten.Where(p => p.IsIll).Count();

:p

Sta me toe om het korter te doen:
Code:
return patienten.Count(p => p.IsIll);
:p
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