Нестационарный метод не может ссылаться на статический контекст
Первый код:
import java.util.*;
//...
class TicTacToe
{
//...
public static void main (String[]arg)
{
Random Random = new Random() ;
toerunner () ; // this leads to a path of
// methods that eventualy gets us to the rest of the code
}
//...
public void CompTurn (int type, boolean debug)
{
//...
boolean done = true ;
int a = 0 ;
while (!done)
{
a = Random.nextInt(10) ;
if (debug) { int i = 0 ; while (i<20) { System.out.print (a+", ") ; i++; }}
if (possibles[a]==1) done = true ;
}
this.board[a] = 2 ;
}
//...
} //to close the class
Вот сообщение об ошибке:
TicTacToe.java:85: non-static method nextInt(int) cannot be referenced from a static context
a = Random.nextInt(10) ;
^
Что именно случилось? Что означает сообщение об ошибке "нестационарный метод не может быть ссылкой из статического контекста"?
Ответы
Ответ 1
Вы вызываете nextInt
статически, используя Random.nextInt
.
Вместо этого создайте переменную Random r = new Random();
, а затем вызовите r.nextInt(10)
.
Было бы обязательно проверить:
Обновление:
Вы действительно должны заменить эту строку,
Random Random = new Random();
с чем-то вроде этого,
Random r = new Random();
Если вы используете имена переменных как имена классов, вы столкнетесь с нагрузкой на лодку. Также как соглашение Java, используйте имена нижнего регистра для переменных. Это может помочь избежать путаницы.
Ответ 2
Вы пытаетесь вызвать метод экземпляра для класса.
Вам следует:
Random rand = new Random();
int a = 0 ;
while (!done) {
int a = rand.nextInt(10) ;
....
Вместо
Как я уже говорил вам fooobar.com/questions/339378/...
Ответ 3
В Java статические методы относятся к классу, а не к экземпляру. Это означает, что вы не можете вызывать другие методы экземпляра из статических методов, если они не вызываются в экземпляре, который вы инициализировали в этом методе.
Здесь вы можете что-то сделать:
public class Foo
{
public void fee()
{
//do stuff
}
public static void main (String[]arg)
{
Foo foo = new Foo();
foo.fee();
}
}
Обратите внимание, что вы запускаете метод экземпляра из экземпляра, который вы создали. Вы не можете просто вызвать метод экземпляра класса непосредственно из статического метода, потому что нет экземпляра, связанного с этим статическим методом.
Ответ 4
Нарушение соглашений об именах Java (имена переменных и имена методов начинаются с нижнего регистра, имена классов начинаются с верхнего регистра) вносит свой вклад в ваше замешательство.
Переменная Random
только "в области видимости" внутри метода main
. Он недоступен для любых методов, называемых main
. Когда вы возвращаетесь из main
, переменная исчезает (она является частью фрейма стека).
Если вы хотите, чтобы все методы вашего класса использовали один и тот же экземпляр Random
, объявите переменную-член:
class MyObj {
private final Random random = new Random();
public void compTurn() {
while (true) {
int a = random.nextInt(10);
if (possibles[a] == 1)
break;
}
}
}