【问题标题】:PrintStackTrace is causing my program to crash. Why?PrintStackTrace 导致我的程序崩溃。为什么?
【发布时间】:2018-10-15 10:06:49
【问题描述】:

我编写了一些简单的代码,它应该可以正常工作。问题是,它没有。我花了一些时间弄清楚数字格式异常的原因是什么。显然,当我尝试输入字母而不是数字时,它应该要求我再次重新输入,但它崩溃了。但是当我删除 e.printStackTrace();它工作得很好。谁能告诉我为什么?

import java.util.Scanner;

public class Test {

public static boolean isInteger(String strNumber) {
    try {
        int number = Integer.parseInt(strNumber);
        if(number > 0) {
            return true;
        }
        return false;
    } catch (NumberFormatException e) {
        e.printStackTrace();

        return false;
    }

}

public static void main(String[] args) {

    String numberString = null;
    int number = 0;
    Scanner scanner = new Scanner(System.in);
    do {
        System.out.println("Enter integer:");
        numberString = scanner.nextLine();

    }   while(!isInteger(numberString));

       number = Integer.parseInt(numberString);
       System.out.println("Your number is: " + number);
       scanner.close();
   }

}

【问题讨论】:

  • 对我来说很好。请记住,Enter number: 可能出现在堆栈跟踪之前甚至中间。正如另一条评论中提到的那样,现在已删除:您不应该在catch-block 中使用return。将return 移到catch 块之外,您的程序应该仍能按预期工作。
  • 你不应该在那里有e.printStackTrace(),因为你正在运行一个控制台应用程序。当用户输入不是整数时,堆栈跟踪只会混淆程序向用户显示的输出(主要是"Enter integer:")。
  • @Turing85 我将 return 移到了 catch-block 之外,但它仍然不起作用。
  • 对我来说仍然可以正常工作。我无法重现您的问题。请确保程序实际终止。我高度怀疑您只是没有看到 Enter number: 输出并假设程序终止,尽管它仍在运行。
  • @Turing85 o.O 你说得对,程序没有终止,这正是我看到“java.lang.NumberFormatException: For input string: etc.”时的想法。所以现在我的问题是,当我捕捉到它时,为什么我会不断收到数字格式异常。 printstacktrace 是什么让程序表现得像现在这样?

标签: java eclipse printstacktrace


【解决方案1】:

我相信您的程序仍在运行。 e.printStackTrace() 显示与您的程序在未捕获异常时相同类型的输出。 示例:

`java.lang.NumberFormatException: For input string: "asdf"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at Test.isInteger(Test.java:7)
    at Test.main(Test.java:29)`

此外,调试输出后您可能看不到"Enter integer: ",因为它发送到的流System.err 与常规打印流System.out 是分开的。这意味着有时,对 System.err 和 System.out 的打印并不总是以它们被调用的顺序出现。

所有这些都说明您的程序可能仍在运行。它看起来就像一个崩溃,因为e.printStackTrace() 打印的信息与您在发生导致崩溃的未捕获异常时获得的信息相同。

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多