“线程中的异常”;“主要”;java.util.NoSuchElementException:在java.util.Scanne中找不到任何行

“线程中的异常”;“主要”;java.util.NoSuchElementException:在java.util.Scanne中找不到任何行,java,methods,Java,Methods,为学校期末项目制作此程序。我尝试运行时出错,不确定需要做什么来修复它。 错误是: Exception in thread "main" java.util.NoSuchElementException: No line found at java.util.Scanner.nextLine(Scanner.java:1585) at BusinessCardMaker.getName(BusinessCardMaker.java:41) at BusinessCardMaker.instr

为学校期末项目制作此程序。我尝试运行时出错,不确定需要做什么来修复它。 错误是:

Exception in thread "main" java.util.NoSuchElementException: No line found

at java.util.Scanner.nextLine(Scanner.java:1585)

at BusinessCardMaker.getName(BusinessCardMaker.java:41)

at BusinessCardMaker.instructions(BusinessCardMaker.java:28)

at BusinessCardMaker.main(BusinessCardMaker.java:131)
我做错了什么。我可以做些什么来改进程序?我的代码有什么问题导致了这些错误

提前感谢大家

import java.util.Scanner;
import java.io.*;
import java.util.Random;
public class BusinessCardMaker{
    private static String wholeName;
    private static String firstLineAddress;
    private static String secondLineAddress;
    private static String company;
    private static String location;
    private static String jobTitle;
    private static int officePhoneNum;
    private static String extNum;
    private static int input;
    private static String email;
    private static int cellNum;
    private static int cardNumber;
    public static void instructions()  throws IOException{
        System.out.println("Welcome to your very own Business Card Maker");
        System.out.println("\nTo access the program please type 1");
        Scanner keyboard = new Scanner(System.in);
        int startProgram = keyboard.nextInt();
        keyboard.close();
        if(startProgram == 1)
        {
            getName();
            getAddress();
            getDepartment();
            getPhoneNums();
            getEmail();
            generateCardNum();
            cardMaker();
        }
    }
    public static void getName()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("Please input your whole name in this format (First M. Last)");
        wholeName = keyboard.nextLine();
        keyboard.close();
    }
    public static void getAddress(){
        Scanner keyboard = new Scanner(System.in);
        System.out.println("What is the first line of your address?");
        firstLineAddress = keyboard.nextLine();
        System.out.println("What is the second line of your address?");
        secondLineAddress = keyboard.nextLine();
        keyboard.close();
    }
    public static void getDepartment(){
        Scanner keyboard = new Scanner(System.in);
        System.out.println("What company do you work for?");
        company = keyboard.nextLine();
        System.out.println("What particular location of company do you work for?");
        location = keyboard.nextLine();
        System.out.println("What is your primary position?");
        jobTitle = keyboard.nextLine();
        keyboard.close();
    }
    public static void getPhoneNums()
    {
        Scanner keyboard = new Scanner(System.in);
        System.out.println("What is your cell phone number?");
        cellNum = keyboard.nextInt();
        System.out.println("What is your office phone number?");
        officePhoneNum = keyboard.nextInt();
        System.out.println("Do you have and office extention? If yes enter 1, if no enter 0");
        input = keyboard.nextInt();
        if (input == 1) {
            Scanner keyboardExt = new Scanner(System.in);
            System.out.println("What is your extention number?");
            extNum = keyboardExt.nextLine();
            keyboardExt.close();
        } else {
            extNum = "N/A";
        }
        keyboard.close();
    }
    public static void getEmail(){
        Scanner keyboard = new Scanner(System.in);
        System.out.println("What is your Email Address?");
        email = keyboard.nextLine();
        keyboard.close();
    }
    public static void generateCardNum(){
        System.out.println("We automatically generated a random business card number");
        Random random = new Random();
        cardNumber = random.nextInt(1000) + 1;
    }
    public static void save() throws IOException    {
        String businessCard = "Business_Card.txt";
        File myFile = new File (businessCard);
        PrintWriter writer = new PrintWriter(myFile);
        System.out.println("Your card has been saved to " + businessCard);
        writer.println("\n\n            Your Business Card");
        writer.println("\n*****************************************************************************");
        writer.println("Card Number:" + cardNumber);
        writer.println("\n"+company);
        writer.println("\n\n\n\n\n                               "+wholeName);
        writer.println("                               "+jobTitle);
        writer.println("\n\n\n\n\n");
        writer.println(location+"                                    "+"Office:"+officePhoneNum+"Ext:"+extNum);
        writer.println(firstLineAddress+"                                    "+"Cell:"+cellNum);
        writer.println(secondLineAddress+"                                    "+"Email:"+email);   
        writer.close();
        }
    public static void checkForFile() throws IOException{
    String businessCard = "Business_Card.txt";
    File myFile = new File (businessCard);
    if(!myFile.exists()){
        myFile.createNewFile();
    }
    }
    public static void cardMaker() throws IOException   {
        System.out.println("\n\n            Your Business Card");
        System.out.println("\n*****************************************************************************");
        System.out.println("Card Number:" + cardNumber);
        System.out.println("\n"+company);
        System.out.println("\n\n\n\n\n                               "+wholeName);
        System.out.println("                               "+jobTitle);
        System.out.println("\n\n\n\n\n");
        System.out.println(location+"                                    "+"Office:"+officePhoneNum+"Ext:"+extNum);
        System.out.println(firstLineAddress+"                                    "+"Cell:"+cellNum);
        System.out.println(secondLineAddress+"                                    "+"Email:"+email);          
        checkForFile();
        save();
    }
    public static void main (String[]args)  throws IOException{
        instructions();
    }
}
keyboard.hasNextLine()
在调用
keyboard.nextLine()之前必须返回true

根据您真正想要实现的目标,您可能希望使用它,如:

if(keyboard.hasNextLine()) {
  String line = keyboard.nextLine();
}
.hasNextLine()
正在被动地阻塞,等待行出现(新的行字符出现),所以下一个解决方案是环绕调用

keyboard.nextLine()

使用try/catch。

您是否可以添加一条注释,显示错误发生的行号,这将是查找错误原因的地方。首先,您需要在通过
nextLine()
获取之前调用
hasNextLine()
,因为
hasNextLine()
阻塞直到输入一行,这
nextLine>()
消耗。其次,你不应该调用
Scanner#close()
扫描仪上
包装
系统。在
中,因为它将关闭
系统。在程序执行的剩余时间内
。@shotgunnija
扫描仪#nextLine
也会阻塞线程,直到有一行可从
系统读取。在
中,因此无需先调用
hasNextLine
(如果您使用
System.in
作为源流)。我认为没有必要关闭扫描仪,您可以添加一个实例变量
Scanner-keyboard
,并将其打开一次。顺便问一下,为什么您的变量是
static
字符串行
,应该在if station;外部定义)这是正确的;您需要将其设置为
if(keyboard.hasNextLine()){line=keyboard.nextLine();}
,或者
while(keyboard.hasNextLine()){line=keyboard.nextLine();processLine(line);if(/*line OK*/)break;}
@OSryx可能会,也可能不会。谁知道呢?@zubergu是的,没错depends@ShotgunNinja这是正确的,首先检查是否有需要阅读的内容更清晰、更安全,但这并不是问题的解决方案,这就是我要说的:D.我还建议先调用
has…
,但如果
中,没有必要这样做:P。但这只是吹毛求疵。