2015-11-08 4 views
1

Мой код:Печать массивов, настройка массивы

import javax.swing.JOptionPane; 

public class IT106_Playlist { 

    public static void main(String[] args){ 

    final int MAX_SONGS = 106; 
    int totalDuration = 0; 
    int numSongs=0; 
    boolean exitVar=false; 
    int i=0; 

    String[] songTitles = new String[MAX_SONGS]; 
    int[] songLengths = new int[MAX_SONGS]; 

    while(exitVar==false && numSongs<=songTitles.length) { 

    if (songTitles.equals("-1")){ 
     exitVar=true; 
    } 

    do{ 

    songTitles[numSongs] = JOptionPane.showInputDialog(null, "Enter a song name, or type -1 to exit"); 
    if (!songTitles.equals("")){ 
     JOptionPane.showMessageDialog(null, "Error: Please enter a valid song name, or type -1 to exit"); 
    }else{ 
    ++numSongs; 
    } 
    }while(!songTitles[numSongs].equals("")); 

    do{ 
    try{ 
    songLengths[numSongs] = Integer.parseInt(JOptionPane.showInputDialog(null, "Enter a song length, e.g. 4, or type -1 to exit")); 
    }catch (NumberFormatException e){ 
      songLengths[numSongs]=-1; 
      JOptionPane.showMessageDialog(null, "Error: please enter a valid song length, e.g. 4, or type -1 to exit"); 
    }  
      totalDuration+=songLengths[numSongs]; 

    /* line 41 */ }while(songLengths[numSongs]=-1); 

    boolean addMore=true; 

    while((numSongs<=MAX_SONGS) && (addMore=true)){ 
    JOptionPane.showMessageDialog(null, "Song #" + i + ": "+ songTitles[i] + " length: " + songLengths[i] + "\n"); 
    i++; 
    if(songTitles[i] ==null){ 
    addMore=false; 
    } 
    } 
} 
} 
} 

Привет. Я пытаюсь понять, почему у меня ошибка в строке 41 моего кода, говорящей, что int не может быть преобразован в boolean, и я хотел знать, почему и как это исправить.

В принципе, я делаю плейлист. Пользователь вводит имя и длину песни отдельно (два разных массива), а затем, когда они либо достигают максимального количества песен, либо они хотят выйти, они могут сделать это, набрав -1.

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

Мы не можем использовать arrayLists или любые методы.

Мой вопрос: 1. моя настройка в порядке, и 2. как мне сделать печать песен после ввода каждого имени песни? Я так близок к тому, чтобы понять это. Спасибо!

+1

Какая линия 41? – RealSkeptic

+0

Правильно укажите свой код. Не делайте этого вручную, пусть ваш редактор (IDE) сделает это за вас (очень легко вручную совершать ошибки). Также опубликуйте полное сообщение об ошибке и укажите на строку, которая вызывает его. – Pshemo

+0

Хорошо, одна секунда, извините – Hello

ответ

0

Является

}while(songLengths[numSongs]=-1); 

возможно должен быть

}while(songLengths[numSongs]==-1); 

Прежний всегда присваивая значение -1 к songLengths[numSongs], что приводит к целому значению, и в Java это не будет преобразовать в логическое значение.

Возможно, вы также указали while((numSongs<=MAX_SONGS) && addmore).

+0

А, да, я исправил это. Теперь я получаю исключение NullPointerException в строке 30 после того, как исправил это. Независимо от того, какой ввод я ввел для названия песни, я получаю сообщение об ошибке, и, если я набираю -1, он все равно меня в цикле. Я не могу это оставить. – Hello

0

Похоже, эта линия является виновником:

while(songLengths[numSongs]=-1); 

То, что вы, кажется, хотят должно быть на самом деле:

while(songLengths[numSongs] == -1); 

Один = означает присвоить значение; a double == предназначен для сравнения значений.

+0

А, да, я исправил это. Теперь я получаю исключение NullPointerException в строке 30 после того, как исправил это. Независимо от того, какой ввод я ввел для названия песни, я получаю сообщение об ошибке, и, если я набираю -1, он все равно меня в цикле. Я не могу это оставить. – Hello

2

Осторожно, здесь есть две проблемы. Одним из них является один показывает ошибку с участием длины песни, это то, что должно быть:

while (songLengths[numSongs] == -1); 

У вас также есть скрытые ошибки пару строк вниз, где вы запускаете while ((numSongs <= MAX_SONGS) && (addMore = true)). Это присвоениеaddMore до true, вы хотите запустить (addMore == true) для сравнения.

EDIT Только что нашел ошибку, связанную с линией 30. Вы проверяете, равен ли String[]"" так: if (!songTitles.equals("")) {. Это неверно, и вы также используете !, вы хотите проверить if (songTitles[numSongs].equals("")) {.

РЕДАКТИРОВАТЬ 2 Оказалось, что это была не вся проблема с линией 30.В вашей do while у вас есть A) A !, где вы этого не хотите, и B) если пользователь действительно вводит правильное название песни, ранее в do while, вы увеличивали numSongs, теперь вам нужно получить предыдущий, чтобы сравнить, как так:

} while (songTitles[numSongs-1].equals("")); 

EDIT 3 & 4 Я теперь полностью прочитать код, и вот что я думаю, что вы ищете. Я добавил комментарии, объясняющие некоторые основные изменения. Кроме того, теперь обработка без использования System.exit(0);.

import javax.swing.JOptionPane; 

public class IT106_Playlist { 

    public static void main(String[] args) { 

     final int MAX_SONGS = 106; 
     int totalDuration = 0; 
     int numSongs = 0; 
     boolean exitVar = false; 
     int i = 0; 

     String[] songTitles = new String[MAX_SONGS]; 
     int[] songLengths = new int[MAX_SONGS]; 

     while (numSongs <= songTitles.length) { 
      // Removed your check to see if the song name is -1, and placed it later on 
      do { 

       songTitles[numSongs] = JOptionPane.showInputDialog(null, 
         "Enter a song name, or type -1 to exit"); 
       if (songTitles[numSongs].equals("")) { 
        JOptionPane.showMessageDialog(null,"Error: Please enter a valid song name, or type -1 to exit"); 
       } else if (songTitles[numSongs].equals("-1")) { // Checks if -1 
        exitVar = true; 
        System.exit(0); // This is how to quickly exit your program safely 
       } 
      } while (songTitles[numSongs].equals("")); // Keep asking the user for input if they don't provide any 

      if (exitVar) { 
       break; 
      } 

      do { 
       try { 
        songLengths[numSongs] = Integer 
          .parseInt(JOptionPane 
            .showInputDialog(null, 
              "Enter a song length, e.g. 4.")); 
        if (songLengths[numSongs] > 0) { // Check if the length is more than 0 (assuming no songs are 0 in length) 
         totalDuration += songLengths[numSongs]; // Add to totalDuration only if it is a valid length 
        } else { // If song length is invalid, display error 
         songLengths[numSongs] = -1; 
         JOptionPane 
         .showMessageDialog(null, 
           "Error: please enter a valid song length, e.g. 4."); 
        } 
       } catch (NumberFormatException e) { // Catch if could not parse int 
        songLengths[numSongs] = -1; 
        JOptionPane 
          .showMessageDialog(null, 
            "Error: please enter a valid song length, e.g. 4."); 
       } 

      } while (songLengths[numSongs] <= 0); // Only do this if you don't have a valid song length 

      boolean addMore = true; 

      while ((numSongs <= MAX_SONGS) && (addMore == true)) { // addMore bug fixed 
       // This is my addition, but to be more user friendly, I put in (i+1), so that the user doesn't question what "Song #0" is 
       JOptionPane.showMessageDialog(null, "Song #" + (i+1) + ": " 
         + songTitles[i] + " length: " + songLengths[i] + "\n"); 
       i++; 
       if (songTitles[i] == null) { 
        addMore = false; 
       } 
      } 
      numSongs++; // Moved this way down here to avoid messing code up above 
     } 
    } 
} 
+0

Я только что изменил это, и я получаю эту ошибку: addMore == false; не является оператором – Hello

+0

@NickRichardson Я имел в виду часть 'while ((numSongs <= MAX_SONGS) && (addMore = true))'. Я никогда ничего не говорил об эквиваленте 'false' ... – Gliderman

+0

Ох. Мои извинения – Hello

Смежные вопросы