【问题标题】:Looping program when I try to close it. How do I fix this infinite loop?当我尝试关闭它时循环程序。如何修复这个无限循环?
【发布时间】:2016-07-13 18:26:05
【问题描述】:

这个程序应该接受用户的输入,把它放到一个文本文件中,然后可以在以后需要时提取信息(尚未实现)。程序打开并接收值并保存它们,但是当我关闭程序时,会出现一个新窗口,并且重复。关于如何阻止这种情况的任何帮助?这可能只是某个地方的休息缺失,但我无法为我的生活修复它。

public class FirstTr {

final private static int MAX_RECORD_NUMBER = 71;
final private static int MAX_PLAYER_NUMBER = 99;
final private static char PLAYER_NAME = 26;
final private static char TEAM_NAME = 26;
final private static int SKILL_LEVEL = 5;
final private static int DRAFT_DATE = 9;
final private static int RECORD_LENGTH = 16;
final private static int PLAYER_ID = 20;
final private static int ID_Length = 5;


public static void main(String[] args) throws FileNotFoundException, IOException {


    File loc = new File("C:\\Users\\Desktop\\Exc2.1.txt");
    RandomAccessFile store = new RandomAccessFile(loc, "rw");
    String id1 = "";
    String id2 = "";
    String id3 = "";
    String id4 = "";
    String id = "";
    String Description = "";
    int recLocation = 0;
    String cmd = "Start";
    String where = "0";




    cmd= JOptionPane.showInputDialog(null, " Please type in a command : new, old or exit");

    if (cmd.compareToIgnoreCase("end")== 0){
        store.close();
        System.exit(0);

    }

    while (cmd.compareToIgnoreCase("end")!= 0){

        if (cmd.compareToIgnoreCase("new") == 0){
            //Ask user for ID 1-20, read ID
            try{
                id1 = JOptionPane.showInputDialog(null,"Enter ID(1-20):");
                recLocation= Integer.parseInt(id1);
                assert Integer.MAX_VALUE == PLAYER_ID;

                JOptionPane.showInputDialog(null, "The ID IS "+ id1);
            }
            catch (Exception e){
                JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");

            }
            try{
                //Ask user for player name, read name
                id2 = JOptionPane.showInputDialog(null, "Enter a players name");
                assert id.length()== PLAYER_NAME;
                JOptionPane.showInputDialog("The players name is " + id2 + " press enter to continue");
                store.writeUTF(id2); 
            }
            catch (Exception e){
                JOptionPane.showInputDialog(null, "SORRY SOMETHING WENT WRONG PLEASE PRESS ENTER TO CONTINUE");

            }
            try{
                //ask for player team name, read team name
                id3 = JOptionPane.showInputDialog(null, "Enter a players team name");
                JOptionPane.showInputDialog("The players team name is " + id3 + ", press enter to continue");
                assert id.length()== TEAM_NAME;
                store.writeUTF(id3);
            }
            catch (Exception e){
                JOptionPane.showInputDialog(null, "SOMETHING WENT WRONG PLEASE PRESS ENTER TO CONTINUE");

            }

            //enter player skill level, read skill level(0-99)
            try{    
                id4 = JOptionPane.showInputDialog(null,"Enter a players skill level (0-99)");
                recLocation = Integer.parseInt(id4);
                JOptionPane.showInputDialog("The players skill level " + id4 + " press enter to continue");
            }
            catch (Exception e){
                JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");

            }
            //enter player skill level, read skill level
            try{    
                id = JOptionPane.showInputDialog(null, "Enter todays Date");
                JOptionPane.showInputDialog("Today is " + id + " press enter to continue");
                assert id.length()== DRAFT_DATE;
                store.writeUTF(id);
            }
            catch (Exception e){
                JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");
                continue;
            }
            //convert ID and skill level to string(char-5)


        }



        //if command is old, ask for ID and read Id, then use ID to retrieve record, display the record formatted for readability


        if (cmd.compareToIgnoreCase("old") == 0) {
            try{
                where = JOptionPane.showInputDialog(null, "Enter player:");
                recLocation = Integer.parseInt(where);
                store.seek((PLAYER_ID) * (recLocation-1));
                Description = store.readUTF();

                JOptionPane.showMessageDialog(null, Description);
            }
            catch(Exception e){
                JOptionPane.showInputDialog("Sorry there is no player try again");
                continue;
            }
        }
    }
}

【问题讨论】:

    标签: java string loops infinite-loop


    【解决方案1】:

    您只读取一次cmd 的输入,然后永远不会重新分配它。所以,如果它的条件 (cmd.compareToIgnoreCase("end")!= 0) 首先为真,那么第一个 while 循环将永远循环。

    【讨论】:

      【解决方案2】:

      你的while loop 是罪魁祸首。循环实际上一直在继续,因为没有任何东西可以改变条件。

      如果您想办法在脚本中的某处将此条件 (cmd.compareToIgnoreCase("end")!= 0) 更改为 true,您的脚本将按照您希望的方式终止!

      注意:您没有将单词"exit" 分配给命令!也许为此制定命令将使脚本执行您想要的操作!

      编辑:尝试在此处的这些 sn-ps 中将 "end" 更改为 "exit"

      if (cmd.compareToIgnoreCase("end")== 0){
              store.close();
              System.exit(0);
      
      while (cmd.compareToIgnoreCase("end")!= 0)
      

      EDIT2:通过将上述 if 语句添加到 while 循环的底部,它应该退出!

      while (cmd.compareToIgnoreCase("exit")!= 0){
      
          if (cmd.compareToIgnoreCase("new") == 0){
              //Ask user for ID 1-20, read ID
              try{
                  id1 = JOptionPane.showInputDialog(null,"Enter ID(1-20):");
                  recLocation= Integer.parseInt(id1);
                  assert Integer.MAX_VALUE == PLAYER_ID;
      
                  JOptionPane.showInputDialog(null, "The ID IS "+ id1);
              }
              catch (Exception e){
                  JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");
      
              }
              try{
                  //Ask user for player name, read name
                  id2 = JOptionPane.showInputDialog(null, "Enter a players name");
                  assert id.length()== PLAYER_NAME;
                  JOptionPane.showInputDialog("The players name is " + id2 + " press enter to continue");
                  store.writeUTF(id2); 
              }
              catch (Exception e){
                  JOptionPane.showInputDialog(null, "SORRY SOMETHING WENT WRONG PLEASE PRESS ENTER TO CONTINUE");
      
              }
              try{
                  //ask for player team name, read team name
                  id3 = JOptionPane.showInputDialog(null, "Enter a players team name");
                  JOptionPane.showInputDialog("The players team name is " + id3 + ", press enter to continue");
                  assert id.length()== TEAM_NAME;
                  store.writeUTF(id3);
              }
              catch (Exception e){
                  JOptionPane.showInputDialog(null, "SOMETHING WENT WRONG PLEASE PRESS ENTER TO CONTINUE");
      
              }
      
              //enter player skill level, read skill level(0-99)
              try{    
                  id4 = JOptionPane.showInputDialog(null,"Enter a players skill level (0-99)");
                  recLocation = Integer.parseInt(id4);
                  JOptionPane.showInputDialog("The players skill level " + id4 + " press enter to continue");
              }
              catch (Exception e){
                  JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");
      
              }
              //enter player skill level, read skill level
              try{    
                  id = JOptionPane.showInputDialog(null, "Enter todays Date");
                  JOptionPane.showInputDialog("Today is " + id + " press enter to continue");
                  assert id.length()== DRAFT_DATE;
                  store.writeUTF(id);
              }
              catch (Exception e){
                  JOptionPane.showInputDialog(null, "SORRY THIS IS NOT AN INTEGER PLEASE PRESS ENTER TO CONTINUE");
                  continue;
              }
              //convert ID and skill level to string(char-5)
      
      
          }
      
      
      
          //if command is old, ask for ID and read Id, then use ID to retrieve record, display the record formatted for readability
      
      
          if (cmd.compareToIgnoreCase("old") == 0) {
              try{
                  where = JOptionPane.showInputDialog(null, "Enter player:");
                  recLocation = Integer.parseInt(where);
                  store.seek((PLAYER_ID) * (recLocation-1));
                  Description = store.readUTF();
      
                  JOptionPane.showMessageDialog(null, Description);
              }
              catch(Exception e){
                  JOptionPane.showInputDialog("Sorry there is no player try again");
                  continue;
              }
      
          if (cmd.compareToIgnoreCase("exit")== 0){
                  store.close();
                  System.exit(0);
                  }
              }
          }
      }
      

      希望这会有所帮助!

      【讨论】:

      • 试过了,但没有改变任何东西。我认为我需要更改 while 和/或 if 的条件,但不确定将其更改为什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2021-12-31
      相关资源
      最近更新 更多