Java应用程序崩溃

Java应用程序崩溃,java,Java,我用Java制作了一个简单的库管理应用程序。当我运行它并输入一本书的标题,例如“Java:如何编程”时,它崩溃了。但是,如果我只输入“Java”而不是“Java:如何编程”,事情就会进展顺利 怎么了?请帮忙 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOExcep

我用Java制作了一个简单的库管理应用程序。当我运行它并输入一本书的标题,例如“Java:如何编程”时,它崩溃了。但是,如果我只输入“Java”而不是“Java:如何编程”,事情就会进展顺利

怎么了?请帮忙

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;

public class MainSystem {

static String fileName = null;
static Library lib = new Library();
static Scanner in = new Scanner(System.in);
static Boolean running = true;

public static void main(String[] args) {
    while (running) {
        System.out.println("\nEnter 0 for load a library."
                + "\nEnter 1 for save and quit"
                + "\nEnter 2 for list all books in library"
                + "\nEnter 3 for add book to library");

        int answer = in.nextInt();
        switch (answer) {
        case 0:
            System.out.println("Enter the file name to load");
            loadScript(in.next());
            break;

        case 1:
            saveAndQuit();
            break;
        case 2:
            System.out.println(lib.toString());
            break;
        case 3:
            addBook();
            break;
        }
    }
    System.exit(0);
}

private static void addBook() {
    // TODO Auto-generated method stub
    int isbn;
    String title, author;
    double price;

    System.out.println("\nEnter Title: ");
    title = in.next();

    System.out.println("\nEnter Author: ");
    author = in.next();

    System.out.println("\nEnter ISBN: ");
    isbn = in.nextInt();

    System.out.println("\nEnter Price: ");
    price = in.nextDouble();

    Book b = new Book(isbn, title, author, price);
    lib.addBook(b);
}

private static void saveAndQuit() {
    // TODO Auto-generated method stub
    System.out.println("Enter file name: ");
    fileName = in.next() + ".ser";
    running = false;
    FileOutputStream fos = null;
    ObjectOutputStream out = null;
    try {
        fos = new FileOutputStream(fileName);
        out = new ObjectOutputStream(fos);
        out.writeObject(lib);
        fos.close();
        out.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

private static void loadScript(String name) {
    // TODO Auto-generated method stub
    FileInputStream fis = null;
    ObjectInputStream in = null;
    File file = new File(name + ".ser");
    if (file.exists()) {
        try {
            fis = new FileInputStream(file);
            in = new ObjectInputStream(fis);
            lib = (Library) in.readObject();
            fis.close();
            in.close();

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    } else {
        System.out.println("\nThe file does not exist!");
    }
}

}

当您想/需要阅读整行时,您正在阅读下一个
字符串。更改此项:

in.next();

在为您的书询问数据时:

private static void addBook() {
    // TODO Auto-generated method stub
    int isbn;
    String title, author;
    double price;

    System.out.println("\nEnter Title: ");
    title = in.nextLine();

    System.out.println("\nEnter Author: ");
    author = in.nextLine();

    System.out.println("\nEnter ISBN: ");
    isbn = in.nextInt();

    System.out.println("\nEnter Price: ");
    price = in.nextDouble();

    Book b = new Book(isbn, title, author, price);
    lib.addBook(b);
}

评论如下:

当我在in.next中更改in.nextLine时,在运行程序时,输入Title和输入Author`同时出现;取而代之的是,首先输入标题,然后输入作者

请注意,
nextLine
将使用每个输入,直到
扫描仪
找到新的换行输入。这意味着您必须在读取书籍数据之前添加额外的
nextLine()

private static void addBook() {
    // TODO Auto-generated method stub
    int isbn;
    String title, author;
    double price;
    in.nextLine(); //consume the data...

    System.out.println("\nEnter Title: ");
    title = in.nextLine();

    System.out.println("\nEnter Author: ");
    author = in.nextLine();

    System.out.println("\nEnter ISBN: ");
    isbn = in.nextInt();

    System.out.println("\nEnter Price: ");
    price = in.nextDouble();

    Book b = new Book(isbn, title, author, price);
    lib.addBook(b);
}
更多信息:


当您想/需要阅读整行内容时,您正在阅读下一个
字符串。更改此项:

in.next();

在为您的书询问数据时:

private static void addBook() {
    // TODO Auto-generated method stub
    int isbn;
    String title, author;
    double price;

    System.out.println("\nEnter Title: ");
    title = in.nextLine();

    System.out.println("\nEnter Author: ");
    author = in.nextLine();

    System.out.println("\nEnter ISBN: ");
    isbn = in.nextInt();

    System.out.println("\nEnter Price: ");
    price = in.nextDouble();

    Book b = new Book(isbn, title, author, price);
    lib.addBook(b);
}

评论如下:

当我在in.next中更改in.nextLine时,在运行程序时,输入Title和输入Author`同时出现;取而代之的是,首先输入标题,然后输入作者

请注意,
nextLine
将使用每个输入,直到
扫描仪
找到新的换行输入。这意味着您必须在读取书籍数据之前添加额外的
nextLine()

private static void addBook() {
    // TODO Auto-generated method stub
    int isbn;
    String title, author;
    double price;
    in.nextLine(); //consume the data...

    System.out.println("\nEnter Title: ");
    title = in.nextLine();

    System.out.println("\nEnter Author: ");
    author = in.nextLine();

    System.out.println("\nEnter ISBN: ");
    isbn = in.nextInt();

    System.out.println("\nEnter Price: ");
    price = in.nextDouble();

    Book b = new Book(isbn, title, author, price);
    lib.addBook(b);
}
更多信息:



这仍然会导致问题,因为在大多数系统上,
字符在路径或文件名中无效。@hexafrance这不是本文的目的。无论如何,更新了。@hexafrance顺便说一句,你甚至可以写
文件:name
,然后被
扫描仪#next
读取,这是没有救的。当我在.next中将
更改为
in.nextLine
时,运行程序
输入标题和
输入作者`同时出现;相反,应该先显示
输入标题
,然后在给出标题后显示
输入作者
。@LuiggiMendoza:您能详细说明一下为什么我们在.nextLine()中使用了额外的
?这仍然会导致问题,因为在大多数系统中,
字符在路径或文件名中无效。@hexafrance这不是本文的目的。无论如何,更新了。@hexafrance顺便说一句,你甚至可以写
文件:name
,然后被
扫描仪#next
读取,这是没有救的。当我在.next中将
更改为
in.nextLine
时,运行程序
输入标题和
输入作者`同时出现;相反,应该先显示
输入标题
,然后在给出标题后显示
输入作者
。@LuiggiMendoza:您能详细说明一下为什么我们在.nextLine()中使用了额外的
阅读书籍前?分享重现问题的步骤。有时阅读规范会有所帮助:如果在阅读文件时出现异常,应在
finally
块中关闭文件。一旦将自己的代码放入方法中,就不需要保留IDE中的
//TODO自动生成的方法存根
注释。它们充其量只是一种干扰。@Braj:这是源代码——抓住它,试着做我在问题中尝试做的事情。我在询问步骤。您是否正在添加新书?请分享复制该问题的步骤。有时阅读规范会有所帮助:如果在阅读文件时出现异常,应在
finally
块中关闭文件。一旦将自己的代码放入方法中,就不需要保留IDE中的
//TODO自动生成的方法存根
注释。它们充其量只是一种干扰。@Braj:这是源代码——抓住它,试着做我在问题中尝试做的事情。我在询问步骤。你在增加一本新书吗?