Avatar billede el-prebsi Nybegynder
16. februar 2003 - 18:54 Der er 12 kommentarer

Methods og generel opbygning af program

Hej..

Jeg er ved at lære lidt java, og skulle lige lave et lille middelvaerdi-program der skulle læse nogle data fra en fil. Men jeg får fejlmeddelelser:

mv_fil.java:28: ')' expected
      while (!checkDouble(linie) AND (linie != null))  //Foerste linie med tal
findes
                                ^
mv_fil.java:28: non-static method checkDouble(java.lang.String) cannot be refere
nced from a static context
      while (!checkDouble(linie) AND (linie != null))  //Foerste linie med tal
findes
              ^
mv_fil.java:38: non-static method checkDouble(java.lang.String) cannot be refere
nced from a static context
        if (checkDouble(linie))                        //Tjekker om det er et t
al, paa den givne linie.
            ^
3 errors



Hvad gør jeg galt - hvordan skal jeg opbygge min fil, med den funktion jeg har. - Skal jeg så stadig have mine public static void main eller skal denne erstattes på anden måde?
Please help?


import cs1.Keyboard;
import java.io.*;

public class mv_fil
{
  //Beregning af middelvaerdi af positive tal,
  //som indtastes. Der afsluttes med et ikke-positivt tal.
  public static void main(String[ ] args)
  {
    int antal;                          //Programmets variable
    double resultat, sum, largest, nyt_tal;
    String linie, file;

    antal = 0;                        //initialisering
    sum = 0;
    largest = 0;

    //Ask for filename
    System.out.print ("Indtast filnavn: ");
    file = new String (Keyboard.readString());

    //laes fil
    try {
      FileReader fr = new FileReader(file);
      BufferedReader inFile = new BufferedReader (fr);

      linie = inFile.readLine();            //Foerste linie læses
      while (!checkDouble(linie) AND (linie != null))    //Foerste linie med tal findes
      {
        linie = inFile.readLine();
      }

      nyt_tal = Double.parseDouble(linie);
      largest = nyt_tal;

      while (linie != null)
      {
        if (checkDouble(linie))                //Tjekker om det er et tal, paa den givne linie.
        {
          ???BEREGNER
        } else
        {
          System.out.println ("FEJL");
        }

    System.out.println(nyt_tal);
        linie = inFile.readLine();
      }

      inFile.close();
    } catch(FileNotFoundException exception)
    {
      System.out.println("Fejl. Filen blev ikke fundet!");
    } catch (IOException exception)
    {
      System.out.println("Fejl!");
    }


    if (!(antal == 0))
    {
    ???NOGET OUTPUT
    } else
    {
      System.out.println("Ingen tal indtastet. Gennemsnit blev ikke fundet!");
    }
  }


  private boolean checkDouble(String tal)
  {
    try {
      Double.parseDouble(tal);
      return true;
    } catch(NumberFormatException exception)
    {
      return false;
    }
  }

}
Avatar billede arne_v Ekspert
16. februar 2003 - 18:57 #1
Når du kalder checkDoublr fra main skal den erklæres static:

private static boolean checkDouble(String tal)
Avatar billede bearhugx Nybegynder
16. februar 2003 - 18:58 #2
prøv at udskift dine AND med && (boolsk AND operator :)
Avatar billede arne_v Ekspert
16. februar 2003 - 18:59 #3
Og man bruger && ikke AND i Java:

while (!checkDouble(linie) && (linie != null))
Avatar billede bearhugx Nybegynder
16. februar 2003 - 18:59 #4
er enig med arne_v - din checkDouble metode skal være statisk --
Avatar billede arne_v Ekspert
16. februar 2003 - 19:19 #5
Derudover så tror jeg at du gør din logik mere kompliceret end nødvendigt.

Dette eksempel spørger om et filnavn, åbner filen og beregner gennemsnit af
de tal der er i filen:

import java.io.*;

public class Average {
    public static void main(String[] args) {
        int n;
        double sum;
        String filename;
        String line;
        try {
            BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("Indtast filnavn: ");
            filename = new String(keyboard.readLine());
                FileReader fr = new FileReader(filename);
                BufferedReader br = new BufferedReader(fr);
                n = 0;
                sum = 0;
                while((line = br.readLine()) != null) {
                    if(checkDouble(line)) {
                        n++;
                        sum += Double.parseDouble(line);
                    }
                }
                br.close();
                fr.close();
                if(n > 0) {
                    System.out.println(n + " numbers with average " + (sum/n));
                } else {
                    System.out.println("No numbers given");
                }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static boolean checkDouble(String tal) {
        try {
            Double.parseDouble(tal);
            return true;
        } catch (NumberFormatException exception) {
            return false;
        }
    }

}
Avatar billede _carsten Nybegynder
16. februar 2003 - 19:51 #6
Må jeg indskyde et spørgsmål til arne_v og bearhugx

Hvad er egentlig begrundelsen for at i mener 'checkDouble' bør være statisk
Avatar billede arne_v Ekspert
16. februar 2003 - 19:55 #7
Man kan ikke bare kalde en ikke-statisk metode (checkDouble)
fra en statisk metode (main).

Man skal enten gøre checkDouble statisk eller lave et objekt af
den klasse som indeholder checkDouble og bruge metoden på det.

Da checkDouble ikke bruger objektet til noget som helst, så
er det pænest at lave metoden til statisk.
Avatar billede arne_v Ekspert
16. februar 2003 - 19:57 #8
Hvis vi tager mit stykke kode som udgangs-punkt (jeg har svært ved at
få mig selv til at skrive et klasse-navn som starter med småt) så ser
alternativet ud som:

Average dummy = new Average();

if(dummy.checkDouble(line))
Avatar billede _carsten Nybegynder
16. februar 2003 - 19:58 #9
Okay - det lyder fornuftigt - har bare aldrig tænkt over det!!

Takker
Carsten
Avatar billede el-prebsi Nybegynder
16. februar 2003 - 20:19 #10
Ups.. må hellere lige få et STORT startbogstav til klassenavn! Det bør jeg vel have!!!
Avatar billede arne_v Ekspert
16. februar 2003 - 20:27 #11
Java code convention siger at:
  - klasse navne starter med stort
  - member/metode/variabel navne starter med småt
Avatar billede arne_v Ekspert
26. februar 2003 - 22:53 #12
el.prepsi>

Er du tilfreds med svaret ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester