Бесконечный цикл Java

Прежде всего это проблема с домашним заданием. Я закончил программу, и она работает нормально; но у меня есть небольшая побочная проблема. Предполагается, что программа сначала читает онлайн текстовый файл и собирает все 50 состояний и их аббревиатуры. Далее я должен попросить пользователя ввести в действительном состоянии аббревиатуру. Как только они это сделают, я должен прочитать другой текстовый файл онлайн и вернуть двух сенаторов за их состояние.

Проблема, с которой я столкнулся, заключается в том, что я хочу зациклить сканер и попросить пользователя ввести состояние. Если они входят в неправильное состояние, то я хочу повторно спросить их. Прямо сейчас, если я вхожу в законное состояние, программа работает нормально. Если я вхожу в неправильное состояние, программа зацикливается и снова просит меня войти в другое состояние. Если я вхожу в неправильное состояние, а затем вхожу в правильное состояние, программа просит меня войти в другое состояние, а не продолжать работу с программой. Любая помощь, пожалуйста?

Я думаю, проблема в том, что когда программа зацикливается, она не читает:

if(stateAbbreviation.equals(abbreviation))
{
  state = splitData[0];
  abbrev = stateAbbreviation;
  found = true;
  break;
}

Снова, делая найденный всегда = ложным.

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Scanner;

public class Senator
{
  static String abbrev; 
  static String state;

  public static void main(String[] args) throws IOException
  {
    // define our URL
    URL serviceURL = new URL("http://i5.nyu.edu/~cmk380/cs101/USStates.txt");

    // connect and obtain data from this URL
    Scanner input = new Scanner( serviceURL.openStream() );
    Scanner input1 = new Scanner(System.in);

    while(true)
    {
      boolean found = false;

      //Ask for state
      System.out.print("Enter state (abbreviation): ");
      String stateAbbreviation = input1.next();

      // read in our data
      while ( input.hasNext() )
      {
        // grab a line
        String data = input.nextLine();

        // split up the line based on the position of the commas
        String[] splitData = data.split(",");

        // grab out the abbreviation
        String abbreviation = splitData[1];  

        if(stateAbbreviation.equals(abbreviation))
        {
          state = splitData[0];
          abbrev = stateAbbreviation;
          found = true;
          break;
        }
      } 

      if (found == true)
      {
        // close our URL
        input.close();
        break;
      }
    }

    double numLines = 0;    

    // define our URL
    URL senatorURL = new URL("http://www.contactingthecongress.org/downloadsContactingCongress.db.txt");

    // connect and obtain data from this URL
    Scanner input2 = new Scanner( senatorURL.openStream() );

    // read in our data
    while ( input2.hasNext() )
    {
      // grab a line
      String data = input2.nextLine();

      if (numLines != 0)
      {
        // split up the line based on the position of the commas
        String[] splitData = data.split("\t");


        if(splitData[0].equals(abbrev+"SR"))
        {
          System.out.println("");
          System.out.println("State: " + state);
          System.out.println("");
          System.out.println("Senior Senator");
          System.out.println("Name: " + splitData[1]);

          //Try catch their information (exception raised if not found)
          try
          {
            System.out.println("Address: " + splitData[3]);
          }
          catch (Exception e)
          {
            System.out.println("Addrress unavailable.");
          }

          try
          {
            System.out.println("Phone: " + splitData[4]);
          }
          catch (Exception e)
          {
            System.out.println("Phone unavailable.");
          }

          try
          {
             System.out.println("Website: " + splitData[7]);
          }
          catch (Exception e)
          {
            System.out.println("Website unavailable.");
          }
          System.out.println("");
        }           

        if(splitData[0].equals(abbrev+"JR"))
        {
          System.out.println("Junior Senator");
          System.out.println("Name: " + splitData[1]);

          //Try catch their information (exception raised if not found)
          try
          {
            System.out.println("Address: " + splitData[3]);
          }
          catch (Exception e)
          {
            System.out.println("Addrress unavailable.");
          }

          try
          {
            System.out.println("Phone: " + splitData[4]);
          }
          catch (Exception e)
          {
            System.out.println("Phone unavailable.");
          }

          try
          {
            System.out.println("Website: " + splitData[7]);
          }
          catch (Exception e)
          {
            System.out.println("Website unavailable.");
          }
          System.out.println("");
        }

      }

      numLines ++; 
    }

    // close our URL
    input2.close();
  }
}

3 ответа

Решение

У вас есть два while а затем вы пытаетесь использовать перерыв, чтобы выйти из него, но вы просто выходите из внутреннего while,

Чтобы выбраться из обоих whiles, вам нужно изменить логику вашей программы или использовать метки (да, Java может использовать метки, и разрыв из внутреннего цикла и внешнего цикла - одно из его применений)

Еще один способ сделать это

        public static boolean checkAbbreive(){
              while(true)
                {
                    boolean found = false;

                    //Ask for state
                    System.out.print("Enter state (abbreviation): ");
                    String stateAbbreviation = input1.next();

                    // read in our data
                    while ( input.hasNext() )
                    {
                        // grab a line
                        String data = input.nextLine();

                        // split up the line based on the position of the commas
                        String[] splitData = data.split(",");

                        // grab out the abbreviation
                        String abbreviation = splitData[1];  

                        if(stateAbbreviation.equals(abbreviation))
                        {
                            state = splitData[0];
                            abbrev = stateAbbreviation;
                            found = true;
                            return found;
                        }

               }
         if (checkAbbreive() == true)
            {
            // close our URL
            input.close();
            break;
            }

    }
}

Обратите внимание, что оба цикла заключены в функцию, и есть команда return found после found = true

Я не уверен, сработает ли это, но попробуйте вырваться из обеих петель.

breakTheWholeWhileLoop:
while(true)
{
   //For this version, we won't need the boolean found 
   //since we'll break out of everything

   //Ask for state
   System.out.print("Enter state (abbreviation): ");
   String stateAbbreviation = input1.next();

   //Read in our data
   while(input.hasNextLine() )
   {
      //...

      if(stateAbbreviation.equals(abbreviation) )
      {
         state = splitData[0];
         abbrev = stateAbbreviation;
         input.close();

         //This piece of code will break out of the while(true) loop
         break breakTheWholeWhileLoop;
      }
   } //while input loop
} //while true loop

//Do the rest

Надеюсь, это поможет.

Другие вопросы по тегам