Строка за пределы, - PullRequest
       1

Строка за пределы,

0 голосов
/ 03 декабря 2011

Эта программа использует клавиши клавиатуры для воспроизведения нот. Я получаю разные строковые индексы вне диапазона для каждой нажатой клавиши, в диапазоне от 49 для 1 до 109 для m. но я всегда получаю это сообщение об ошибке. Я новичок в Java, и любая помощь будет принята с благодарностью, так как я проверил несколько форумов и не нашел ответа на такие проблемы.

В этой строке выдается исключение:

nextnote = keyboard.charAt(key);

Это мой код:

public class GuitarHero {
    public static void main(String[] args) {
        //make array for strings
        double[] notes = new double[37];
        GuitarString[] strings = new GuitarString[37];
        int nextnote;
        int firstnote=0;
        double NOTE = 440.0;
        String keyboard ="1234567890qwertyuiopasdfghjklzxcvbnm";
        //for loop to set notes
        for(int i=0;i<37;i++){
            double concert = 440.0* Math.pow(2, (i-24)/12.0);
            notes[i] = concert;
            for(int j=0;j<37;j++){
                strings[j] = new GuitarString(concert);
            }
        }
        while (true) {
            // check if the user has typed a key; if so, process it
            if (StdDraw.hasNextKeyTyped()) {
                char key = StdDraw.nextKeyTyped();
                //charAt gets index of character in string 
                nextnote = keyboard.charAt(key);
                //make sure value is within string
                if(nextnote>=0 && nextnote<37){
                    // pluck string and compute the superposition of samples
                strings[nextnote].pluck();
                    double sample = strings[firstnote].sample() 
                          +strings[nextnote].sample();
                    StdAudio.play(sample);
                    // advance the simulation of each guitar string by one step   
                    strings[nextnote].tic();
                    firstnote=nextnote;
                }
        }
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Вы хотите позвонить String#indexOf(int), что даст вам индекс персонажа.String#charAt(int) возвращает символ с указанным индексом.

1 голос
/ 03 декабря 2011

Проблема здесь: StdDraw.nextKeyTyped(); документация гласит:

Какой следующий ключ был введен пользователем?Этот метод возвращает символ Unicode, соответствующий введенному ключу (например, «a» или «A»).Он не может идентифицировать клавиши действий (например, клавиши F1 и клавиши со стрелками) или клавиши-модификаторы (например, управление).

key - это символ, а не индекс в этой строке.Вместо этого выполните следующее:

int charIndexInKeyboard = keyboard.indexOf(key);
if(charIndexInKeyboard == -1) // char not recognized
nextnote = keyboard.charAt(charIndexInKeyboard );

nextnote теперь должен содержать нужный символ.

РЕДАКТИРОВАТЬ: Вот как теперь должен выглядеть ваш цикл while

while (true) {
    // check if the user has typed a key; if so, process it
    if (StdDraw.hasNextKeyTyped()) {
        char key = StdDraw.nextKeyTyped();
        int charIndexInKeyboard = keyboard.indexOf(key);
        if(charIndexInKeyboard == -1){
            // Not recognized, just continue to next
            continue;
        }
        nextnote = keyboard.charAt(charIndexInKeyboard);
        // pluck string and compute the superposition of samples
        strings[nextnote].pluck();
        double sample = strings[firstnote].sample()
        +strings[nextnote].sample();
        StdAudio.play(sample);
        // advance the simulation of each guitar string by one step
        strings[nextnote].tic();
        firstnote=nextnote;
    }
}
1 голос
/ 03 декабря 2011

Вам нужен метод indexOf

Возвращает индекс в этой строке первого вхождения указанного символа

, а не charAt

Возвращает значение char по указанному индексу.Индекс находится в диапазоне от 0 до length () - 1. Первое значение в последовательности последовательности находится в индексе 0, следующее в индексе 1 и т. Д., Как для индексации массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...