Бесконечный цикл 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
,
Чтобы выбраться из обоих while
s, вам нужно изменить логику вашей программы или использовать метки (да, 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
Надеюсь, это поможет.