Хранение и доступ к строкам в Java (используя массивы) - PullRequest
0 голосов
/ 21 ноября 2011

Я пытаюсь ввести количество строк (названий песен) в массив.Затем программа попросит пользователя назвать одну из песен и сообщить пользователю, в какую позицию была помещена эта песня в массиве.

Редактировать:

Спасибо за помощь, ребята.Я установил оба цикла для 0 и у меня все еще проблемы.У меня разные проблемы с программой.Я получаю ошибки времени выполнения ArrayIndexOutOfBoundsException и NullPointerExeption.

Что мне делать, чтобы это работало?

Заранее всем спасибо.

Код:

import javax.swing.*; // import the swing library for I/O

class favsongs
{

   public static void main (String[] param)
{
      music();
      System.exit(0);

} // END main


/* ***************************************************
   Set up an array containing songs then find one asked for by the user
*/

public static void music()
{

   // Declare variables
   //
String key =""; //the thing looked for
int result = -1;// the position where the answer is found
String[] songs = new String[5];





// Ask for songs
for (p=0; p<=4; p++)
{   

         songs[p]=JOptionPane.showInputDialog("Song "+ p + "?");
    }

// Ask user for a song
key = JOptionPane.showInputDialog("Name a song and i'll tell you what position you placed it in.");

    for (int i=0; i<songs.length; i++)
    {

       if (songs[i].equals(key))
       {
          result = i;   
       }
       else // Error message
       {
       JOptionPane.showMessageDialog(null,"Error!!");
       break;
       }
    }
    // Tells user the name of the song and what position in the array it is in
   JOptionPane.showMessageDialog(null,"You placed " + key + " in position " + " " + result);

} // END music

 } // END class favsongs

Ответы [ 4 ]

3 голосов
/ 21 ноября 2011

Посмотрите на этот цикл:

for (p=1; p<=4; p++)

Обратите внимание, что он начинается с 1. Так что songs[0] по-прежнему будет иметь значение по умолчанию null.Теперь посмотрим, как вы используете массив:

for (int i=0; i<songs.length; i++)
{
   if (songs[p].equals(key))

Мало того, что вы пытаетесь использовать p здесь, когда я думаю, что вы имеете в виду i, но либо способ потерпит неудачу.Использование p позволит получить доступ к songs[5], выходящему за пределы, а использование i вызовет equals для songs[0], что является нулевым.

Надеюсь, этого достаточно, чтобы вы смогли продолжить работу.Несколько других моментов:

  • Ваше "Извините, что?"подсказка внутри цикла.Вы имели в виду, что это так?
  • Вы должны взглянуть на соглашения об именах Java, как для заглавных букв, так и для придания вашим методам более значимых имен
  • Вы должны попытаться объявить переменные в узкой области видимостинасколько это возможно.Вы бы не смогли ошибиться, используя p в неправильном месте, если бы объявили его как часть цикла for.
0 голосов
/ 21 ноября 2011

Ваша проблема, кажется, здесь:

for (p=1; p<=4; p++)
{  
    songs[p]=JOptionPane.showInputDialog("Song "+ p + "?");
}

В Java расположения массивов начинаются с 0 и заканчиваются на [arrayLength] - 1.

Подобные действия должны решить вашу проблему:

for (p=0; p < song.length(); p++)
{  
    songs[p]=JOptionPane.showInputDialog("Song "+ p + "?");
}

Это руководство по от Oracle должно помочь вам начать работу.Вы также можете взглянуть на класс ArrayList , который позволит вам динамически добавлять элементы в список, как показано в этом простом учебном пособии.

0 голосов
/ 21 ноября 2011

Во-первых, ваш цикл для помещения песен в начинается с 1, при попытке установить p = 0, массивы переходят от нуля к длине -1. Попробуйте это и посмотрите, решит ли это проблему

0 голосов
/ 21 ноября 2011
// Ask for songs
for (p=1; p<=4; p++)
{      

     songs[p]=JOptionPane.showInputDialog("Song "+ p + "?");
}

это оставит песни [0] неинициализированными.Когда вы попытаетесь использовать его позже, вы получите исключение NullPointerException.

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