Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2016, 13:15   #1
Lama Under Cover
Пользователь
 
Аватар для Lama Under Cover
 
Регистрация: 15.08.2016
Сообщений: 32
По умолчанию Почему ошибка?

Здравствуйте! Имеется два класса, код детский, однако при компиляции выводит ошибку

Код:
"C:\Program Files\Java\jdk1.8.0_112\bin\java" -Didea.launcher.port=7539 "-Didea.launcher.bin.path=C:\Users\admin\AppData\Roaming\JetBrains\IntelliJ IDEA 2016.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_112\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_112\jre\lib\rt.jar;C:\Users\admin\IdeaProjects\JHF_SYP_107\out\production\JHF_SYP_107;C:\Users\admin\AppData\Roaming\JetBrains\IntelliJ IDEA 2016.2.5\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain JHF_SYP_107
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
1
	at JHF_SYP_107.main(JHF_SYP_107.java:13)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

Process finished with exit code 1
Класс 1:

Код:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class JHF_SYP_107 {
    private static int numOfGuesses;
    public static String operatorInput;

    public static void main(String[] args) throws Exception {
        SimpleDotCom single = new SimpleDotCom();
        int startingPosition = (int) (Math.random() * 4);
        System.out.println(startingPosition);
        for (int i = 0; i < 4; i++) {
            single.locationCells[i] = startingPosition + i;
        }
        while (single.checkYourself(operatorInput) != "kill") {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String operatorInput = bufferedReader.readLine();
            numOfGuesses = numOfGuesses + 1;
            single.checkYourself(operatorInput);
            System.out.println(numOfGuesses);
        }
    }
}
Класс 2:

Код:
public class SimpleDotCom {
    int[] locationCells = new int[3] ;
    int numOfHits;

    public String checkYourself(String stringGuess) {
        int guess = Integer.parseInt(stringGuess);
        String result = "miss";
        for (int cell : locationCells) {
            if (guess == cell) {
                result = "hit";
                numOfHits++;
                break;
            }
        }
        if (numOfHits == locationCells.length)
            result = "kill";
        System.out.println(result);
        return result;
    }
}
Этот код работает:
Код:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class JHF_SYP_107 {
    private static int numOfGuesses;
    public static String operatorInput;

    public static void main(String[] args) throws Exception {
        SimpleDotCom single = new SimpleDotCom();
        int startingPosition = (int) (Math.random() * 4);
        System.out.println(startingPosition);
        single.locationCells[0] = startingPosition;
        single.locationCells[1] = startingPosition+1;
        single.locationCells[2] = startingPosition+2;

        while (single.result != "kill") {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String operatorInput = bufferedReader.readLine();
            numOfGuesses = numOfGuesses + 1;
            single.checkYourself(operatorInput);
            System.out.println(numOfGuesses);
        }
    }
}
Почему цикл for и single.checkYourself(operatorInput) вызывают ошибки?
http://imageshack.com/a/img922/5707/6yizfA.gif
Lama Under Cover вне форума Ответить с цитированием
Старый 11.11.2016, 14:10   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Код:
 for (int i = 0; i < 4; i++) {
            single.locationCells[i] = startingPosition + i;
        }
Выходишь за границы массива: внутри массив длины 3, у которого валидные индексы 0,1,2. Когда ты обращаешься к locationCells[3] выкидывает исключение.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 11.11.2016, 14:13   #3
Lama Under Cover
Пользователь
 
Аватар для Lama Under Cover
 
Регистрация: 15.08.2016
Сообщений: 32
По умолчанию

Изменил код, все работает:

Код:
/**
 * Created by admin on 11.11.2016.
 */

public class SimpleDotCom {
    private static int[] locationCells = new int[3] ;
    private static int numOfHits;
    private static String result = "miss";

    public static String resultToGame() {
         return result;
    }
    public static int[] locationCellsToGame() {
        return locationCells;
    }


    public static String checkYourself(String stringGuess) {
        int guess = Integer.parseInt(stringGuess);

        for (int cell : locationCells) {
            result = "miss";
            if (guess == cell) {
                result = "hit";
                numOfHits++;
                    break;
                }
                }
        if (numOfHits == locationCells.length)
            result = "kill";
        System.out.println(result);
        return result;
    }
}
и

Код:
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class JHF_SYP_107 {
    private static int numOfGuesses;
    public static String operatorInput;

    public static void main(String[] args) throws Exception {
        SimpleDotCom single = new SimpleDotCom();
        int startingPosition = (int) (Math.random() * 4);
        System.out.println(startingPosition);
        for (int i = 0; i < 3; i++) {
            single.locationCellsToGame()[i] = startingPosition + i; //always send the values of the other classes through the methods
        }
        while (single.resultToGame() != "kill") { //always send the values of the other classes through the methods
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
            String operatorInput = bufferedReader.readLine();
            numOfGuesses = numOfGuesses + 1;
            single.checkYourself(operatorInput);
            System.out.println(numOfGuesses);
        }
    }
}

Почему single.checkYourself(operatorInput) нельзя использовать вместо single.resultToGame()?
http://imageshack.com/a/img922/5707/6yizfA.gif
Lama Under Cover вне форума Ответить с цитированием
Старый 11.11.2016, 15:23   #4
Lama Under Cover
Пользователь
 
Аватар для Lama Under Cover
 
Регистрация: 15.08.2016
Сообщений: 32
По умолчанию

Правильно ли понимаю то, что "single.checkYourself(operatorInput ) != ..." при первой проверке ссылается на значение, которого еще нет.

Потому что при задании public static String operatorInput = "11" в начале ошибки не возникает, при этом программа выводит "miss" на каждой итерации (аналогично отрабатывает и цикл do while)
http://imageshack.com/a/img922/5707/6yizfA.gif

Последний раз редактировалось Lama Under Cover; 11.11.2016 в 15:50.
Lama Under Cover вне форума Ответить с цитированием
Старый 13.11.2016, 13:29   #5
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Объяснил бы для начала, что ты хочешь.

А вообще, код немного неправильный идеологически.


Цитата:
Сообщение от Lama Under Cover Посмотреть сообщение
for (int i = 0; i < 3; i++) { single.locationCellsToGame()[i] = startingPosition + i; //always send the values of the other classes through the methods }
Вот здесь, например, ты не передаёшь данные в другой класс с помощью метода. Ты заполняешь массив, который непонятно откуда взят.

По-хорошему, надо объявить метод set/КонкретноЧтоМыТутЗаписываем/ с аргументами index и value и заполнять массив так: single.setV(i, i + startingPosition);

Ну, и да, почему в классе SimpleDotCom все члены статические? Ты же с объектом пытаешься работать, убери static в описании.
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 15.11.2016, 22:17   #6
Lama Under Cover
Пользователь
 
Аватар для Lama Under Cover
 
Регистрация: 15.08.2016
Сообщений: 32
По умолчанию

Цитата:
Сообщение от New man Посмотреть сообщение
Объяснил бы для начала, что ты хочешь.

А вообще, код немного неправильный идеологически.



Вот здесь, например, ты не передаёшь данные в другой класс с помощью метода. Ты заполняешь массив, который непонятно откуда взят.

По-хорошему, надо объявить метод set/КонкретноЧтоМыТутЗаписываем/ с аргументами index и value и заполнять массив так: single.setV(i, i + startingPosition);

Ну, и да, почему в классе SimpleDotCom все члены статические? Ты же с объектом пытаешься работать, убери static в описании.
Спасибо за советы!
http://imageshack.com/a/img922/5707/6yizfA.gif
Lama Under Cover вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему ошибка??? firephenix Помощь студентам 3 27.10.2012 23:22
почему ошибка? megostudent Общие вопросы по Java, Java SE, Kotlin 1 06.01.2012 02:02
Почему ошибка маГГ85 PHP 2 25.12.2011 17:28
почему ошибка??? beygul Помощь студентам 1 15.11.2008 19:46