当前位置: 首页 > 知识库问答 >
问题:

无限循环被卡住,java中的代码有问题

傅正阳
2023-03-14

目前的任务是制作一个输血管理器应用程序,该应用程序可以有效地选择输血的献血者。

启动应用程序时,应尝试打开两个文件:“donors.txt”和“recipients.txt”。如果其中一个文件丢失,程序应宣布问题并退出。两个文件都应按以下方式格式化:每行应包含一个人的全名和他们的血型,用分号分隔。程序应首先读取donors.txt,将每行拆分为姓名和血型,并将生成的数组作为新元素存储在捐献者数组列表中。它还应将列表打印在屏幕上,并检查每个人的血型是否有效。如果发现无效血型,则不应将条目添加到阵列列表中,并应通知用户哪个条目有问题。然后应以类似的方式读取、处理和存储(在接受者阵列列表中)这是任务的第一部分

这是我以前的代码,在更新它以接近任务结束时,我发现代码停止工作,我调试了它,发现它卡在一个无限循环中,不知道如何修复它,或者是否有其他方法重写它以使其工作,可能不使用while循环

package java_assigment_4;
import java.io.*;
import java.util.*;

public class java_assigment_4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner file_donors;
        Scanner file_recp;
        ArrayList list_donors = new ArrayList();
        ArrayList list_recp = new ArrayList();
        String blood_type = "o- o+ a- a+ b- b+ ab- ab+";


        try
        {
            file_donors = new Scanner(new FileReader("donors.text"));

            while (file_donors.hasNextLine())
            {
                list_donors.add(file_donors.nextLine());  // store donors  names & blood type in array list 

            }//end while

            file_donors.close();
         }//end try

        catch (FileNotFoundException e)
        {
            System.out.println("Error: " + e.getMessage());
        }//end catch


        try
        {
            file_recp = new Scanner(new FileReader("recipients.text"));

            while (file_recp.hasNextLine())
            {
                list_recp.add(file_recp.nextLine());  // store recipents names & blood type in array list 
            }//end while

            file_recp.close();
         }//end try

        catch (FileNotFoundException e)
        {
            System.out.println("Error: " + e.getMessage());
        }//end catch

        System.out.println("donors " + list_donors);
        System.out.println("\n");
        System.out.println("recipents " + list_recp);

       // for (int i=0;i<list_donors.size();i++) {
       // list_donors.contains(";"); // need a substring to store type after ; 
        }
    }
}

下面的代码是最新的代码,是不起作用的代码

public class java_assigment_4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner file_donors;
        Scanner file_recp;
        ArrayList<String> list_donors = new ArrayList<String>();
        ArrayList<String> list_recp = new ArrayList<String>(); 
        String [] blood_type = {"o-","o+","a-","a+","b-","b+","ab-","ab+"};

        try
        {
            file_donors = new Scanner(new FileReader("donors.txt"));

            while (file_donors.hasNextLine())
            {

                  for (int i=0;i<list_donors.size();i++) {

                        String donor=list_donors.get(i);
                        String type =donor.substring((donor.indexOf(";") + 1)); // look for ; and stores info after witch is the blood type into a substring so i can use for checking if vaild 
                        type=type.trim();



                         for (int z=0;z<blood_type.length;z++) {
                             if (type.equals(blood_type [z])) { compares the two lists
                                 list_donors.add(file_donors.nextLine());  // store donors names & blood if vaild type in array list 
                             }
                             else {
                                 System.out.println( "this person with blood;" + type + " is not valid ");
                                    }
                                }
                            }
                        }
                        file_donors.close();

                    } 

                    catch (FileNotFoundException e)
                    {
                        System.out.println("Error: " + e.getMessage());
                    }


        System.out.println("donors " + list_donors);

        try
        {
            file_recp = new Scanner(new FileReader("recipients.txt"));

            while (file_recp.hasNextLine())
            {
                  for (int i=0;i<list_recp.size();i++) {

                        String recp=list_recp.get(i);
                        String type =recp.substring((recp.indexOf(";") + 1));
                        type=type.trim();



                         for (int z=0;z<blood_type.length;z++) {
                             if (type.equals(blood_type [z])) { // compares the two lists 
                                 list_recp.add(file_recp.nextLine());  // store recp names & blood type if vaild in array list 
                             }
                             else {
                                 System.out.println( "this person with blood ;" + type + " is not valid ");
                                    }
                                }
                            } 
                        }

                        file_recp.close();
                     }

                    catch (FileNotFoundException e)
                    {
                        System.out.println("Error: " + e.getMessage());
                    }

       // System.out.println("donors " + list_donors);
       // System.out.println("\n");
       // System.out.println("recipents " + list_recp);


    }

}

共有1个答案

叶建柏
2023-03-14

list_donors.size()将始终返回0,因为list_donors在开始时为空

所以代码从不调用file\u捐赠者。nextLine()

并且file_donors.hasNextLine()将始终为真

public class java_assigment_4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner file_donors;
        Scanner file_recp;
        ArrayList<String> list_donors = new ArrayList<String>();
        ArrayList<String> list_recp = new ArrayList<String>(); 
        String [] blood_type = {"o-","o+","a-","a+","b-","b+","ab-","ab+"};

        try
        {
            file_donors = new Scanner(new FileReader("donors.txt"));

            // file_donors.hasNextLine() always true in your code
            while (file_donors.hasNextLine())
            {
               // list_donors.size() will return 0, cause the list_donors is empty when it begins
               // so the code never enter this for and never call file_donors.nextLine()
               for (int i=0;i<list_donors.size();i++) {
               ...
               }
            }

你可以避免这种情况

  while (file_donors.hasNextLine())
  {
    string current_line = file_donors.hasNextLine();

使用一些代码更新以提供帮助

import java.io.*;
import java.util.*;


public class Blood
{
  public static void main(String[] args)
  {
    ArrayList<String> list_donors = new ArrayList<String>();
    ArrayList<String> list_recp = new ArrayList<String>();

    System.out.println("Starting!");
    copyFromFile("/home/mitz/stackoverflow/java/Donors.txt", list_donors);
    System.out.println("imported "+ list_donors.size() + " registers");

    copyFromFile("/home/mitz/stackoverflow/java/Receptors.txt", list_recp);
    System.out.println("imported "+ list_recp.size() + " registers");
    System.out.println("Finished!");
  }

  public static void copyFromFile(String filename, ArrayList<String> listDestiny)
  {
    Scanner fileScanner;
    FileReader fileReader;
    try
    {
      fileReader = new FileReader(filename);
      fileScanner = new Scanner(fileReader);

      while (fileScanner.hasNextLine())
      {
        String currentLine = fileScanner.nextLine();
        String type = currentLine.substring((currentLine.indexOf(";") + 1));
        if(isValidBloodType(type))
        {
          listDestiny.add(currentLine);
          System.out.println("Imported: " + currentLine);
        }else{
          System.out.println("Invalid blood type!! Alien detected with blood type: " + type);
        }
      }

      fileScanner.close();
    }
    catch (FileNotFoundException e)
    {
      System.out.println("Arquivo não encontrado");
    }
  }

  public static Boolean isValidBloodType(String type)
  {
      String[] blood_type = {"o-", "o+", "a-", "a+", "b-", "b+", "ab-", "ab+"};
      return Arrays.asList(blood_type).contains(type);
  }
}

 类似资料:
  • 问题内容: 请看下面的Java 无限循环。它导致其下面的语句的编译时错误。 以下相同的无限循环可正常工作,并且不会发出任何错误,其中我只是用布尔变量替换了条件。 同样在第二种情况下,循环之后的语句显然不可访问,因为布尔变量为true,但编译器根本没有抱怨。为什么? 编辑:显然,以下版本的卡在无限循环中,但是即使循环中的条件始终存在,因此循环下面的语句也不会对该语句下的语句发出任何编译器错误,因此循

  • 问题内容: 我正在使用第三方库来处理大量数据集。该过程偶尔会陷入无限循环(或被阻塞- 不知道为什么并且无法进入代码)。我想在设定的时间后消除这个问题,然后继续处理下一个案件。一个简单的例子是: processData通常最多需要1秒。我想设置一个计时器,该计时器在10秒后杀死processData() 编辑我将不胜感激代码片段(我没有在使用Thread的过程中练习过)。执行器方法看起来很有用,但我

  • 你好,有人能解释一下为什么这会形成一个无限循环吗?谢谢!

  • 你好,有人能解释一下为什么这会形成一个无限循环吗。谢谢

  • 这对于注入存储库很有效,但是对于调用任何存储库的任何函数,请返回AutoWireHelper.AutoWire行。 这是我的代码,EntityListener执行autowireHelper.autowire,当涉及到“find”方法时,返回到autowire行: 我的错误: 无法提交JPA事务;嵌套异常为javax.persistence.RollbackException:提交事务时出错12:

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l