异常消息如何超过已执行的打印行

我从用“;”分隔的 .csv 文件中读取字段 分号。我写了例外来处理可能的偏差。但如果出现异常,NetBeans 会在最后一行之前读出错误消息。

这是输出的样子:

http://img3.mukewang.com/6288a4980001176205480098.jpg

我不明白代码中的后面一行怎么可能预先打印出来。这是我的整个代码:


public static void reader(String fileName) throws IOException {

    try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {

        String line;

        List<String> lineHolder = new ArrayList<>();

        StringTokenizer divider;

        String formatter = "%2s|%-30s|%-30s|%10s|%n";


        String separator = "----------";

        System.out.format("ID|%-30s|%-30s|birth date|%n", "name", "email");

        System.out.print("--+" + separator + separator + separator 

                + "+" + separator + separator + separator + "+" 

                + separator + "+\n");


        while ((line = br.readLine()) != null){

            if (line.startsWith("#", 0))

                continue;

            if (!line.contains(";")) {

                throw new IOException("too less data or not proper delimiter");

            }

            divider = new StringTokenizer(line, ";");

            lineHolder = arrayFiller(divider);

            dataChecker(lineHolder, line);

            System.out.format(formatter, lineHolder.get(0), lineHolder.get(1)

                , lineHolder.get(2), lineHolder.get(3));

        }

    } catch (FileNotFoundException ex) {

        System.err.println("The file not found.");

    } catch (IOException ex){

        System.err.println(ex.getMessage());

    }

    System.out.print("\n");

}


public static ArrayList<String> arrayFiller(StringTokenizer divider) {

    ArrayList<String> lineHolder = new ArrayList<>();

    while (divider.hasMoreTokens()) {

        lineHolder.add(divider.nextToken());

    }

    return lineHolder;

}


qq_花开花谢_0
浏览 76回答 2
2回答

宝慕林4294392

错误消息通过不同的输出流打印。标准输出流stdout用于正常记录/输出,错误(通过 System.err.println)转到stderr. 您的控制台/终端同时显示两者,但它们不会互相等待完成打印内容。编辑:也许这也有帮助。EDIT2:如果您将错误更改为打印到文件,您将在控制台/终端中丢失错误输出。但也许这对你没问题?像这样://set err out to print to filePrintStream ps = new PrintStream("err.log");System.setErr(ps);//cause exception for testing itString s = null;s.length();如果您希望将错误和标准输出都打印到控制台/终端,则无法控制两个流的时间,因为每个打印行都是独立的操作。

一只名叫tom的猫

&nbsp; String separator = "----------";&nbsp; &nbsp; System.out.format("ID|%-30s|%-30s|birth date|%n", "name", "email");&nbsp; &nbsp; System.out.print("--+" + separator + separator + separator&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "+" + separator + separator + separator + "+"&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + separator + "+\n");&nbsp; &nbsp; System.out.flush();&nbsp; &nbsp; while ((line = br.readLine()) != null)由于 System.out 和 System.err 来自不同的输出流,它们不会等待对方完成。在打印语句之后立即清除缓冲区内存可以解决问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java