为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

qq_花开花谢_0 2022-05-21 16:36:17
我从用“;”分隔的 .csv 文件中读取字段 分号。我写了例外来处理可能的偏差。但如果出现异常,NetBeans 会在最后一行之前读出错误消息。这是输出的样子:我不明白代码中的后面一行怎么可能预先打印出来。这是我的整个代码: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;}
查看完整描述

2 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

错误消息通过不同的输出流打印。标准输出流stdout用于正常记录/输出,错误(通过 System.err.println)转到stderr. 您的控制台/终端同时显示两者,但它们不会互相等待完成打印内容。


编辑:也许这也有帮助。


EDIT2:如果您将错误更改为打印到文件,您将在控制台/终端中丢失错误输出。但也许这对你没问题?像这样:


//set err out to print to file

PrintStream ps = new PrintStream("err.log");

System.setErr(ps);


//cause exception for testing it

String s = null;

s.length();

如果您希望将错误和标准输出都打印到控制台/终端,则无法控制两个流的时间,因为每个打印行都是独立的操作。


查看完整回答
反对 回复 2022-05-21
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

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

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

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

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

            + separator + "+\n");

    System.out.flush();

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

由于 System.out 和 System.err 来自不同的输出流,它们不会等待对方完成。在打印语句之后立即清除缓冲区内存可以解决问题。



查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信