Avatar billede styrup Nybegynder
19. december 2002 - 21:40 Der er 20 kommentarer og
1 løsning

non-static method cannot be referenced from a static context

aften'

jeg sidder midt i en afleveringsopgave, og har ikke den store kompetence inden for Java-programmering. og har DESPERAT brug for hjælp....

opgave:
et lille (ubetydeligt) windows program, bygget op omkring et binært søgetræ, der kan lagre og genfinde data.

jeg har lavet klasserne - men får fejlen:

"Frame1.java": Error #: 308 : non-static method Insert(Sortable) cannot be referenced from a static context at line 135, column 24

og har ikke den fjerneste ide om hvordan jeg skal løse det....
Avatar billede aslan Nybegynder
19. december 2002 - 21:44 #1
smid lige koden op plz..
Avatar billede arne_v Ekspert
19. december 2002 - 21:45 #2
Du har en static metode (kan være main) som kalder en metode
der ikke er statisk.

Det kan man ikke.
Avatar billede arne_v Ekspert
19. december 2002 - 21:46 #3
Enten erklærer du metoden static.

Eller så laver du et objekt af den type (Frame1) og kalder
metode for det objekt.
Avatar billede arne_v Ekspert
19. december 2002 - 21:47 #4
public class X {
    public static void main(String[] args) {
        test();
    }
    private void test() {
        return;
    }
}

duer ikke !

Men det gør:

public class X {
    public static void main(String[] args) {
        test();
    }
    private static void test() {
        return;
    }
}

og:

public class X {
    public static void main(String[] args) {
        X x = new X();
        x.test();
    }
    private void test() {
        return;
    }
}
Avatar billede styrup Nybegynder
19. december 2002 - 21:54 #5
til aslan:

den er ret lang - og ligger i 6 forskellige klasser...
Avatar billede arne_v Ekspert
19. december 2002 - 21:56 #6
Frame1.java linie 135 befinder sig i en statisk metode.

Insert(Sortable) metoden som befinder sig et eller andet
sted er ikke statisk.

Se mit lille eksempel ovenfor.
Avatar billede styrup Nybegynder
19. december 2002 - 21:59 #7
arne v - er desværre ikke helt med -
hvad nu når jeg har det liggende i 6 forskellige klasser (af pædagogiske grunde) - skal jeg bare lave fejl-klasserne om til public static...??
Avatar billede bearhugx Nybegynder
19. december 2002 - 22:01 #8
kode ønskes ... Se evt http://www.eksperten.dk/spm/296387 - Det er et lignende problem...
Avatar billede bearhugx Nybegynder
19. december 2002 - 22:01 #9
F.eks. lad os se Frame1.java-filen
Avatar billede arne_v Ekspert
19. december 2002 - 22:02 #10
Du skal overveje om de metoder hvis kald giver fejl skal ændres til static
eller om det er metode der kalder som skal lave en instans af objektet
og kalde metode for dette objekt.

2 muligheder => du skal vælge

Og du skal vælge udfra om metoderne faktisk er statiske (kan kaldes
helt standalone) eller de er ikke-statiske (skal bruge diverse
variable defineret for instanser af pågældende klasse).
Avatar billede styrup Nybegynder
19. december 2002 - 22:03 #11
det nederste eksempel du viser - det er en constructor ikk!? - jeg mener også det er det jeg har gjort, men det virker nok ikke rigtig som det skal...
Avatar billede arne_v Ekspert
19. december 2002 - 22:05 #12
Ja i det sidste eksempel laver jeg et objekt af typen X
(og X's constructor bliver kaldt derved).

Så kan man kalde ikke statiske metoder.
Avatar billede styrup Nybegynder
19. december 2002 - 22:05 #13
her er koden til Frame1:::

******************************************************************
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.*;
import java.awt.event.*;

public class Frame1 extends JFrame
{
  JTextField NavnTextField = new JTextField();
  JLabel jLabel1 = new JLabel();
  JButton Gem = new JButton();
  JButton Find = new JButton();
  JButton Slet = new JButton();
  JButton Ret = new JButton();
  JButton Nulstil = new JButton();
  JEditorPane Vissefelt = new JEditorPane();
  private JTextField VersionTextField = new JTextField();
  private JLabel jLabel2 = new JLabel();
  private JLabel jLabel3 = new JLabel();
  private JTextField AarstalTextField = new JTextField();
  private JLabel jLabel4 = new JLabel();
  private JTextField StoerrelseTextField = new JTextField();
  private JLabel jLabel5 = new JLabel();
  private JTextField EjerTextField = new JTextField();
  private JLabel jLabel6 = new JLabel();
  private JTextField SoegefeltTextField = new JTextField();


SystemCD CD, MidlertidigCD = new SystemCD("","","","","");

String Navn;
String Version;
String Aarstal;
String Stoerrelse;
String Ejer;


  public Frame1()
  {
    try
    {
      jbInit();
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }

  }

  private void jbInit() throws Exception
  {
    this.getContentPane().setLayout(null);
    this.setSize(new Dimension(433, 505));
    NavnTextField.setBounds(new Rectangle(82, 30, 215, 30));
    jLabel1.setText("Navn");
    jLabel1.setBounds(new Rectangle(20, 35, 35, 25));
    Gem.setText("Gem");

    Gem.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Gem_actionPerformed(e);
      }
    });
    Gem.setBounds(new Rectangle(33, 238, 70, 25));
    Find.setText("Find");

    Find.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Find_actionPerformed(e);
      }
    });
    Find.setBounds(new Rectangle(112, 238, 70, 25));
    Find.setActionCommand("Find");
    Slet.setText("Slet");
    Slet.setBounds(new Rectangle(272, 238, 70, 25));
    Ret.setText("Ret");
    Ret.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Ret_actionPerformed(e);
      }
    });
    Ret.setBounds(new Rectangle(192, 238, 70, 25));
    Nulstil.setText("Nulstil");
    Nulstil.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        Nulstil_actionPerformed(e);
      }
    });
    Nulstil.setBounds(new Rectangle(353, 238, 70, 25));
    Vissefelt.setBounds(new Rectangle(77, 324, 220, 172));
    VersionTextField.setBounds(new Rectangle(82, 68, 216, 30));
    jLabel2.setText("Version");
    jLabel2.setBounds(new Rectangle(19, 75, 65, 21));
    jLabel3.setText("Årstal");
    jLabel3.setBounds(new Rectangle(18, 105, 70, 29));
    AarstalTextField.setBounds(new Rectangle(83, 107, 214, 32));
    jLabel4.setText("Størrelse");
    jLabel4.setBounds(new Rectangle(18, 151, 72, 24));
    StoerrelseTextField.setBounds(new Rectangle(82, 150, 216, 30));
    jLabel5.setText("Ejer");
    jLabel5.setBounds(new Rectangle(19, 196, 64, 24));
    EjerTextField.setBounds(new Rectangle(81, 194, 218, 27));
    jLabel6.setText("Søgefelt:");
    jLabel6.setBounds(new Rectangle(15, 283, 60, 34));
    SoegefeltTextField.setBounds(new Rectangle(74, 285, 197, 31));
    this.getContentPane().add(jLabel1, null);
    this.getContentPane().add(jLabel2, null);
    this.getContentPane().add(VersionTextField, null);
    this.getContentPane().add(NavnTextField, null);
    this.getContentPane().add(jLabel3, null);
    this.getContentPane().add(AarstalTextField, null);
    this.getContentPane().add(jLabel4, null);
    this.getContentPane().add(StoerrelseTextField, null);
    this.getContentPane().add(jLabel5, null);
    this.getContentPane().add(EjerTextField, null);
    this.getContentPane().add(Gem, null);
    this.getContentPane().add(Find, null);
    this.getContentPane().add(Ret, null);
    this.getContentPane().add(Slet, null);
    this.getContentPane().add(Nulstil, null);
    this.getContentPane().add(Vissefelt, null);
    this.getContentPane().add(jLabel6, null);
    this.getContentPane().add(SoegefeltTextField, null);
  }

  void Gem_actionPerformed(ActionEvent e)
  {
    Navn = NavnTextField.getText();
    Version = VersionTextField.getText();
    Aarstal = AarstalTextField.getText();
    Stoerrelse = StoerrelseTextField.getText();
    Ejer = EjerTextField.getText();

    CD = new SystemCD(Navn, Version, Aarstal, Stoerrelse, Ejer);
    if (!BinSearchTree.Insert(CD))
      Vissefelt.setText(CD.GetDisplayText()+ "\n" + "CD er ikke gemt");
    else
      Vissefelt.setText(CD.GetDisplayText()+"\n" + "CD er gemt");

    NavnTextField.setText("");
    VersionTextField.setText("");
    AarstalTextField.setText("");
    StoerrelseTextField.setText("");
    EjerTextField.setText("");
  }

  void Find_actionPerformed(ActionEvent e)
  {
    Navn = SoegefeltTextField.getText();
    MidlertidigCD.SetNavn(Navn);
    if (!BinSearchTree.Find(MidlertidigCD))
      Vissefelt.setText("CD er ikke fundet!!!");
    else
    {
      CD = (SystemCD)BinSearchTree.Current();

      Vissefelt.setText(CD.GetDisplayText()+ "\n" + "CD er fundet" + "\n");

      NavnTextField.setText(CD.GetNavn());
      VersionTextField.setText(CD.GetVersion());
      AarstalTextField.setText(CD.GetAarstal());
      StoerrelseTextField.setText(CD.GetStoerrelse());
      EjerTextField.setText(CD.GetEjer());
    }
  }

  void Ret_actionPerformed(ActionEvent e)
  {
    Navn = NavnTextField.getText();
    Version = VersionTextField.getText();
    Aarstal = AarstalTextField.getText();
    Stoerrelse = StoerrelseTextField.getText();
    Ejer = EjerTextField.getText();

    CD.SetNavn(Navn);
    CD.SetVersion(Version);
    CD.SetAarstal(Aarstal);
    CD.SetStoerrelse(Stoerrelse);
    CD.SetEjer(Ejer);

    Vissefelt.setText(CD.GetDisplayText() + "\n" + "CD er rettet" + "\n");

    NavnTextField.setText("");
    VersionTextField.setText("");
    AarstalTextField.setText("");
    StoerrelseTextField.setText("");
    EjerTextField.setText("");
  }

  void Nulstil_actionPerformed(ActionEvent e)
  {
    NavnTextField.setText("");
    VersionTextField.setText("");
    AarstalTextField.setText("");
    StoerrelseTextField.setText("");
    EjerTextField.setText("");

    Vissefelt.setText("Felterne er tomme !!");
  }
  }

***********************************************************
Avatar billede arne_v Ekspert
19. december 2002 - 22:08 #14
Du kalder:

BinSearchTree.Insert(CD)

og Insert er ikke static i BinSearchTree.java !
Avatar billede arne_v Ekspert
19. december 2002 - 22:09 #15
Så enten skal den erklæres static eller så skal du:

BinSearchTree bst = new BinSearchTree();  // muligvis skal der argumenter på constructor
bst.insert(CD);
Avatar billede arne_v Ekspert
19. december 2002 - 22:10 #16
Jeg vil gætte på, at det skal være det sidste.

BiNSearchTree.insert lyder som noget, hvor der skal være en instans !
Avatar billede styrup Nybegynder
19. december 2002 - 22:12 #17
Jeg kan ikke få det til at virke, her er kode til BinSearchTree, hvis det kan hjælpe.

'*******************************************************************

public boolean Insert ( Sortable S )
{

  BinTreeNode x;
  boolean indsat = false; //hvis der indsættes en node i træet

    if(Find(S)) //hvis cd'en findes i forvejen
    {
    now = top;
    indsat = false;
    }

    else
    {
        x = new BinTreeNode(S);  //hjælpenode

        if (Empty())  //hvis træet er tomt
        {
        top = x;
        now = x;
        indsat = true;  //en node er indsat
        }

        else
        {
          if (S.CompareTo((Sortable)now.GetData()) < 0)
          {
            now.SetLeftChild(x);
            now = x;
          }
          if (S.CompareTo((Sortable)now.GetData()) > 0)
          {
            now.SetRightChild(x);
            now = x;
          }
          indsat = true;  //der er indsat en node

        }
    }
    return indsat;  //returnere den indsatte node
}
Avatar billede soelvpil Nybegynder
19. december 2002 - 22:16 #18
Tja, sandsynligvis mangler du bare at skrive static foran metoden i BinSearchTree.

Men lige et MEGET godt råd. Almindelig kodestandard er, at metoder og variabler starter med småt, mens klassenavne starter med stort. Hvis variabelnavnet består af flere sammensatte ord, er det første med småt, f.eks. ejerTextField i stedet for EjerTextField.

Følges denne konvention, er man aldrig i tvivl om man er i gang med at kalde en metode på et objekt, eller på en klasse (dvs en statisk metode)
Avatar billede arne_v Ekspert
19. december 2002 - 22:16 #19
Jeg er helt sikker nu.

Du skal lave en:

Så enten skal den erklæres static eller så skal du:

BinSearchTree bst = new BinSearchTree();

og kalde med:

bst.insert(CD);
i Frame1 !

Den første linie skal formentlig sættes in allerførst
(i jbInit f.eks.).
Avatar billede arne_v Ekspert
19. december 2002 - 22:17 #20
Jeg vrøvler.

public class Frame1 extends JFrame {
  BinSearchTree bst;

private void jbInit() throws Exception {
  bst = new BinSearchTree();

bst.insert(CD);
Avatar billede styrup Nybegynder
19. december 2002 - 22:28 #21
det virker - takker......

vender muligvis tilbage senere, det skal lige finpudses - og som sagt så er java ikke min stærke side !?
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
Kategori
Kurser inden for grundlæggende programmering

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