2014-07-03 10 views
10

W zasadzie udoskonalam, kończę i próbuję skompilować kod testowy z podręcznika dla początkujących java. Celem jest stworzenie gry zgadującej, w której cel znajduje się w 3 ciągłych komórkach (trzymam lokalizacje w tablicy), a użytkownik odgaduje numer komórki. zniszczyć komórkę docelową za pomocą komórki.Błąd Java: niedozwolony start wyrażenia

Sprawdziłem tutaj pół tuzina wpisów na ten sam błąd, ale nie mogłem ustalić, co się stało.

To jest mój błąd:

test.java:5: error: illegal start of expression 
public int[] locations={1,2,3}; 
^ 
1 error 

i mojego kodu jest:

public class test{ 

     public static void main(String[] args){ 

      test dot=new test(); 
      public int[] locations={1,2,3}; 

      dot.setLocationCells(locations); 

      String userGuess="2"; 
      String result = dot.checkYourself(userGuess); 
      String testResult="failed"; 

      if(result.equals("hit")){ 
       testResult="passed"; 
      } 


      System.out.println(testResult); 
     } 

public String checkYourself(String stringGuess){ 
     int guess=Integer.parseInt(stringGuess); 
     String result="miss"; 
     int numOfHits=0; 

     for(int cell:locations){ 
      if(guess==cell){ 
       result="hit"; 
       numOfHits++; 
       break; 
       } 
      } 

     if(numOfHits==locations.length){ 
      result="kill"; 
      } 

     System.out.println(result); 
     return result; 
    } 


public void setLocationCells(int[] locations){ 
     int[] locns; 
     locns=locations; 
     } 

} 
+0

czasami występuje problem z adnotacją, np. @Import {xxx, xxx,} istnieje dodatkowy, przed zamknięciem nawiasu zamykającego –

Odpowiedz

14

Metody mogą zadeklarować tylko zmienne lokalne. To dlatego kompilator zgłasza błąd podczas próby zadeklarowania go jako publicznego.

W przypadku zmiennych lokalnych nie można użyć żadnego akcesora (publicznego, chronionego lub prywatnego).

Powinieneś także śledzić, co oznacza słowo kluczowe. W metodzie checkYourself używa się deklaracji locations.

Statyczne słowo kluczowe wyróżnia elementy dostępne przy tworzeniu obiektu. Tam bowiem nie ma części samego obiektu.

public class Test { //Capitalized name for classes are used in Java 
    private final ini[] locations; //key final mean that, is must be assigned before object is constructed and can not be changed later. 

    public Test(int[] locations) { 
     this.locations = locations;//To access to class member, when method argument has the same name use `this` key word. 
    } 

    public boolean ckeckYourSelf(int value) { //This method is accessed only from a object. 
     for(int location : locations) { 
     if(location == value) { 
      return true; //When you use key word return insied of loop you exit from it. In this case you exit also from whole method. 
     } 
     } 
     return false; //Method should be simple and perform one task. So you can ge more flexibility. 
    } 
    public static int[] locations = {1,2,3};//This is static array that is not part of object, but can be used in it. 

    public static void main(String[] args) { //This is declaration of public method that is not part of create object. It can be accessed from every place. 
     Test test = new Test(Test.locations); //We declare variable test, and create new instance (obect) of class Test. 
     String result; 
     if(test.checkYourSelf(2)) {//We moved outsie the string 
     result = "Hurray";   
     } else { 
     result = "Try agian" 
     } 
     System.out.println(result); //We have only one place where write is done. Easy to change in future. 
    } 
} 
+0

Mój kompilator nie generuje błędu (po prostu zadeklarowałem publiczne statyczne lokalizacje int [] poza głównym). Czy na pewno metody mogą zadeklarować tylko zmienne lokalne? – AnujaPL

+0

Tak. Kiedy przenosisz deklarację poza główną, to nie jest już w zakresie metody, ale w zakresie klasy. A następnie możesz zadeklarować to publicznie. –

+0

@AnujaPL, Napisałem ponownie klasę, którą zaprojektowałeś z wyjaśnieniami, które mogą być pomocne w przyszłości. –

1

stwierdzenie public static int[] locations={1,2,3}; poza głównym sposobem.

+0

, który zadziałał. Czy możesz mi powiedzieć, dlaczego muszę to zrobić? Czy samo słowo kluczowe publiczne nie zapewni dostępu do wszystkich moich klas i metod wewnątrz i na zewnątrz głównego? – AnujaPL

+1

Nie można używać publicznego w ramach metody. Jeśli chcesz, aby inne metody/klasy miały dostęp do "lokalizacji", muszą być zadeklarowane jako publiczne w twojej klasie. – user1071777

+0

Nie należy używać publicznej alokacji statycznej dla koncepcji przepływu danych. To rozwiązuje sprawę, ale jest rodzajem problemu projektowania. –

5

Usunięcie słowa kluczowego public z int[] locations={1,2,3};. Modyfikator dostępu nie jest dozwolony wewnątrz metody, ponieważ jego dostępność jest określona przez zakres metody.

Jeśli Twoim celem jest użycie tego odniesienia w wielu metodach, możesz chcieć przenieść deklarację poza metodę.

2
public static int [] locations={1,2,3}; 

public static test dot=new test(); 

Stwierdzenie powyższe zmienne powyżej głównej metody i kod kompiluje.

public static void main(String[] args){ 
+0

To zadziałało .. Dzięki :) – AnujaPL