2013-05-18 2 views
0

У меня есть эта функцияПолучение ошибки: «не статический метод не может ссылаться из статического контекста» при вызове функции из главного

private ArrayList<Letters> getLettersInfo(String input) 
{ 
     ArrayList<Letters> al = new ArrayList<Letters>(); 
     for (char c : ALPHABET.toCharArray()) 
     { 
      Letters l = new Letters(); 
      l.setLetter(Character.toString(c)); 
      int count = countOccurrences(input, c); 
      l.setCount(count); 
      l.setFrequency(count/28); 
      al.add(l); 
     } 
     return al; 
} 

Тогда я пытаюсь это мой главный:

ArrayList<Letters> al = new ArrayList<Letters>(); 
al = getLettersInfo(plainText); 
for(Letters l : al) 
{ 
     System.out.print("Letter: " + l.getLetter() + ", " 
       + "Count: " + l.getCount() + ", " 
       + "Frequency: " + l.getFrequency()); 
} 

но Я получаю non static method cannot be referenced from a static context. Я прочитал кое-что об этой ошибке, но все выглядит нормально. Любая помощь?

+0

Но это не так, потому что вы пытаетесь вызвать метод экземпляра из своей статической функции. Либо создайте экземпляр, либо сделайте метод статическим. –

+0

Большие усилия по поиску обманов, все. –

ответ

2

Изменить функцию:

private static List<Letters> getLettersInfo(String input) 

И пока мы на ней я предлагаю следующее рефакторинга:

for(Letters l: getLettersInfo(plainText)) 
{ 
     System.out.print(String.format("Letter: %s, Count: %d, Frequence: %d", 
      l.getLetter(), 
      l.getCount(), 
      l.getFrequency()); 
} 

Вы, вероятно, знакомы с Java, и вы должны позже узнать о static и первый приоритет понимания основ. Поэтому я предлагаю создать отдельный класс, который содержит только ваш метод main и поместить все остальные вещи в разные классы.

В вашем случае ваш main будет выглядеть

public static void main(String[] args) 
{ 
    Info info = new Info(); // your newly created class 
    for(Letters l: info.getLettersInfo(plainText)) 
    { 
     // ... 
    } 
} 

или (с info встраиваемыми):

public static void main(String[] args) 
{ 
    for(Letters l: new Info().getLettersInfo(plainText)) 
    { 
     // ... 
    } 
} 
+0

Вы должны объяснить * почему * они должны менять свой код на это. –

+0

Вы хотите сделать это только в том случае, если метод не требует установки значений в самом объекте. Если это связано с этим, вам нужно попробовать свой путь ниже. Если нет, то это имеет смысл. –

0

Погрешность означает, что вы не можете вызвать метод, который не статична от метода это статично.

Основной метод является статическим, поэтому он не может вызвать какой-либо из классов нестатических методов, если вы не создаете экземпляр класса и не вызываете метод в этом экземпляре.

Например:

MyClass foo = new MyClass(); 
... 
a1 = foo.getLettersInfo(plainText); 
0

I read somethings about this error but it seems all ok. Any help?

Я не думаю, что так.

метод main неотъемлемо объявлен static, потому что он должен был быть таким, чтобы иметь возможность работать в качестве точки входа в программу, и она не привязана к какой-либо инстанции в то время как ваш

private ArrayList<Letters> getLettersInfo(String input) 

не объявлен static поэтому вы не можете вызвать его из контекста static, потому что getLettersInfo следует называть присоединенным к конкретному экземпляру. Я не уверен, что заставляет вас думать, что все в порядке. Поверните getLettersInfo в метод static, добавив ключевое слово.

+0

Это не «по своей сути» статичный, он * объявлен * статический. –

+0

Это по своей сути статично, чтобы программа работала. В противном случае вы не сможете запустить его.Это не 'статический', потому что вы вынуждены объявлять его статическим, но поскольку иначе оно не будет служить его цели. – Jack

+0

@DaveNewton Если вы не объявляете основной статический, это не главный метод. Ваша программа не будет запускаться непосредственно из этого файла класса без нее. Вот почему Джек говорит, что он наследует статичность: он должен быть объявлен таким образом. –

Смежные вопросы