#java #file #java.util.scanner
#java #файл #java.util.scanner
Вопрос:
Я пытаюсь написать программу, которая считывает файл и проверяет каждую строку, содержащую определенное слово, а затем печатает его. если его нет, он должен напечатать «нет соответствия для вашего поиска».это то, что у меня есть до сих пор, и у меня возникли проблемы с объединением всего этого. после всех моих размышлений и замены while
на if
или помещения второго оператора if за пределы while, иногда не имеет значения, что я ввожу, всегда говорится «нет соответствия для вашего поиска», а иногда говорится java.util.NoSuchElementException: Строка не найдена. и иногда он зависает, и я искал это, и он говорит, что это ошибка в cmd или что-то в этом роде.любая помощь будет оценена, и я новичок в Java, поэтому, пожалуйста, любая вещь, которую вы можете мне посоветовать, будет полезна и оценена
System.out.println("search for book");
String search = scan.next();
scan.nextLine();
File file = new File("library.txt");
Scanner in = null;
in = new Scanner(file);
String line = in.nextLine();
while(in.hasNext()) {
if(line.contains(search)) {
System.out.println(line);
}
if(!line.contains(search)) {
System.out.println("no match for your search");
System.exit(0);
}
}
Комментарии:
1.
String line=in.nextLine();
должно быть внутриwhile
цикла.2. @Johnny Mopp да, изначально это было, но я пытался найти решение и… да, но спасибо, я бы, наверное, забыл и потратил еще 2 дня на то, чтобы разобраться
3. @Johnny Mopp но разве это не даст «не удается найти символ» в строке строки??
4. Вы могли бы использовать a,
boolean found = false
который устанавливается (found = true;)
при нахождении слова. Затем измените последнюю часть наif (!found) {System.out.println("no match for your search");}
5. @Джонни Мопп , спасибо тебе .
Ответ №1:
Не говоря уже о логических ошибках в вашем коде, вам, вероятно, следует создать логическую (логическую) переменную вне цикла и установить для нее значение false
. Если вы столкнулись с вашим условием, установите его в true
. После цикла while проверьте значение. Если это значение равно false, это означает, что строки не были найдены, и вы должны распечатать свое сообщение.
Пример:
boolean foundAnything = false;
while(...) {
...
if(condition) {
foundAnything = true;
...
}
...
}
// Nothing was found
if(!foundAnything) {
...
}
Ответ №2:
иногда не имеет значения, что я ввожу, там всегда написано «не соответствует вашему запросу».
Самая большая проблема здесь — это эта часть внутри вашего цикла:
while(in.hasNext()) {
if(line.contains(search)) {
System.out.println(line);
}
if(!line.contains(search)) {
System.out.println("no match for your search");
//HERE!!!
System.exit(0);
}
}
System.exit(0)
остановит программу, и больше ничего выполняться не будет. Таким образом, если search
слово не найдено в строке, программа завершается.
иногда он говорит java.util.NoSuchElementException: Строка не найдена
Вы читаете первую строку перед циклом, и, возможно, у вас есть пустой файл.
File file = new File("library.txt");
Scanner in = null;
in = new Scanner(file);
//this reads the first line of the file
String line = in.nextLine();
while(//rest of code...
Вы можете преодолеть эти две проблемы с помощью:
- Считывайте содержимое файла только в цикле
- Используйте флаг, чтобы проверить, было ли найдено слово
- Останавливайте цикл только в том случае, если слово было найдено или если в файле больше нет строк
- В цикле, если слово еще не найдено, просто позвольте ему продолжаться
- Избегайте использования
System#exit
, если это действительно не необходимо - Если после завершения цикла слово не было найдено, выведите сообщение
Учитывая эти предложения, ваш код может быть разработан следующим образом:
File file = new File("library.txt");
Scanner in = new Scanner(file);
//Use a flag to check if the word was found
boolean found = false;
//Stop the loop only if the word was found OR if the file has no more lines
while (!found amp;amp; in.hasNextLine()) {
//Read the contents of the file only in the loop
String line = in.nextLine();
if (line.contains(search)) {
found = true;
System.out.println(line);
}
//In the loop, if the word is not found yet, just let it continue
}
//If after the loop the word was not found, print a message
if (!found) {
System.out.println("no match for your search");
}
Комментарии:
1. но почему он внезапно читает только первую строку
2. Что вы имеете в виду? Ведет ли себя код внизу подобным образом?
3. нет, я, э-э, говорил об этом. тот, что внизу, работает, но что заставляет этот работать по-другому?
4. Ну, в коде, которым вы поделились, вы открываете сканер, а затем сразу же читаете первую строку. Я объяснил это в части «Вы читаете первую строку перед циклом, и, возможно, у вас есть пустой файл»
Ответ №3:
Прежде всего, вы, кажется, пропускаете свою первую строку. Во-вторых, второе предложение if является избыточным.
Boolean found=false;
while(in.hasNext()) {
String line = in.nextLine();
if(line.contains(search)) {
System.out.println(line);
found=true;
}
}
if(found==false) System.out.println("no match for your search");