#java #compiler-errors
#java #ошибки компилятора
Вопрос:
Я в основном уточняю, завершаю и пытаюсь скомпилировать тестовый код из справочника для начинающих Java. Цель состоит в том, чтобы создать игру в угадайку, в которой цель расположена в 3 непрерывных ячейках (я держу местоположения в массиве), и пользователь угадывает номер ячейки. чтобы уничтожить целевую ячейку за ячейкой.
Я проверил полдюжины сообщений здесь об одной и той же ошибке, но я не мог понять, что происходит не так.
Это моя ошибка:
test.java:5: error: illegal start of expression
public int[] locations={1,2,3};
^
1 error
и мой код:
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 resu<
}
public void setLocationCells( int[] locations){
int[] locns;
locns=locations;
}
}
Комментарии:
1. иногда возникает проблема с аннотацией, например, @Import{xxx,ххх,} перед закрывающей скобкой стоит лишнее
Ответ №1:
Методы могут объявлять только локальные переменные. Вот почему компилятор сообщает об ошибке при попытке объявить его общедоступным.
В случае локальных переменных вы не можете использовать какой-либо способ доступа (общедоступный, защищенный или частный).
Вы также должны знать, что означает ключевое слово static. В методе checkYourself
используется массив целых чисел locations
.
Ключевое слово static выделяет элементы, которые доступны при создании объекта. Следовательно, они не являются частью самого объекта.
public class Test { //Capitalized name for classes are used in Java
private final init[] 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 checkYourSelf(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 get 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 (object) of class Test.
String resu<
if(test.checkYourSelf(2)) {//We moved outside the string
result = "Hurray";
} else {
result = "Try again"
}
System.out.println(result); //We have only one place where write is done. Easy to change in future.
}
}
Комментарии:
1. Мой компилятор не выдает ошибку (я просто объявил общедоступные статические расположения int [] за пределами main). Вы уверены, что методы могут объявлять только локальные переменные?
2. ДА. Когда вы перемещаете объявление за пределы main, оно больше не находится в области метода, а в области класса. И тогда вы можете объявить его общедоступным.
3. @AnujaPL, я переписал разработанный вами класс с некоторыми пояснениями, которые могут оказаться полезными в будущем.
Ответ №2:
Удалите public
ключевое слово из int[] locations={1,2,3};
. Модификатор доступа не разрешен внутри метода, поскольку его доступность определяется областью действия метода.
Если ваша цель состоит в том, чтобы использовать эту ссылку во многих методах, вы можете захотеть переместить объявление за пределы метода.
Ответ №3:
public static int [] locations={1,2,3};
public static test dot=new test();
Объявите вышеупомянутые переменные над методом main, и код скомпилируется нормально.
public static void main(String[] args){
Ответ №4:
Объявить
public static int[] locations={1,2,3};
вне основного метода.
Комментарии:
1. это сработало. Можете ли вы сказать мне, почему мне нужно это сделать? Разве само ключевое слово public не гарантирует, что все мои классы и методы внутри и снаружи main смогут получить к нему доступ?
2. Вы не можете использовать public внутри метода. Если вы хотите, чтобы другие методы / классы имели доступ
locations
, он должен быть объявлен как общедоступный в вашем классе.3. Вы не должны использовать общедоступное статическое распределение для концепций потока данных. Это решает проблему, но отчасти создает проблему дизайна.