天道酬勤,学无止境

除以0.0时,为什么Java不抛出异常?(Why doesn't Java throw an Exception when dividing by 0.0?)

问题

我有代码来计算2个数字之间的百分比差- (oldNum - newNum) / oldNum * 100; -两个数字均为double 。 我希望在oldNum为0的情况下必须添加某种检查/异常处理。但是,当我对oldNum和newNum的值均为0.0进行测试运行时,执行继续,就好像什么都没有发生并且没有引发任何错误一样。 如果将这些代码与int一起运行,肯定会导致算术除数为零的异常。 对于double为什么Java会忽略它?

回答1

从数学上讲,零除的结果是undefined ,可以用浮点数/双精度数表示(因为NaN不是数字),但是从根本上讲这不是错误的。

由于整数必须具有特定的数值,因此在处理它们时必须在除以零时引发错误。

回答2

Java的floatdouble类型,与几乎所有其他语言(以及几乎任何硬件FP单元)一样,实现了针对浮点数学运算的IEEE 754标准,该标准要求除以零以返回特殊的“无穷大”值。 引发异常实际上会违反该标准。

整数算法(由Java以及大多数其他语言和硬件以二进制补码表示)是不同的,并且没有特殊的无穷或NaN值,因此抛出异常是一种有用的行为。

回答3

双精度数的存储方式与int完全不同。 有关Java如何处理双重计算的详细说明,请参见http://firstclassthoughts.co.uk/java/traps/java_double_traps.html。 您还应该阅读浮点数,特别是非数字(NaN)的概念。

如果您有兴趣了解有关浮点表示的更多信息,建议阅读此文档(Word格式,抱歉)。 它深入研究了数字的二进制表示形式,这可能对您的理解有所帮助。

回答4

除以零(0或0.00)时

  1. 如果您将double除以0,则JVM将显示Infinity

    public static void main(String [] args){ double a=10.00; System.out.println(a/0); }

    控制台: Infinity

  2. 如果将int除以0,则JVM将抛出Arithmetic Exception

    public static void main(String [] args){ int a=10; System.out.println(a/0); }

    控制台: Exception in thread "main" java.lang.ArithmeticException: / by zero

  3. 但是,如果我们将int除以0.0,则JVM将显示Infinity:

    public static void main(String [] args){ int a=10; System.out.println(a/0.0); }

    控制台: Infinity

这是因为JVM会自动将强制类型转换为double,因此我们得到了无限而不是ArithmeticException。

回答5

尽管Java开发人员了解double原始类型和Double类,但是在进行浮点运算时,他们对Double.INFINITYNaN-0.0以及其他控制涉及它们的算术计算的规则的关注不足。

这个问题的简单答案是,它不会抛出ArithmeticException并返回Double.INFINITY 。 另外,请注意,即使x本身是NaN ,比较x == Double.NaN始终为false

要测试x是否为NaN ,应使用调用Double.isNaN(x)的方法来检查给定的数字是否为NaN。 这在SQL非常接近NULL

它可能对您有帮助。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 为什么用浮点数(或双精度)将数字除以零不会在Java中抛出java.lang.ArithmeticException:/(Why does division by zero with floating point (or double precision) numbers not throw java.lang.ArithmeticException: / by zero in Java)
    问题 以下语句将java.lang.ArithmeticException: / by zero明显抛出java.lang.ArithmeticException: / by zero 。 System.out.println(0/0); 因为立即数0被认为是int立即数,并且在整数算术中不允许除以零。 但是,以下情况不会引发任何异常,例如java.lang.ArithmeticException: / by zero 。 int a = 0; double b = 6.199; System.out.println((b/a)); 它显示Infinity 。 以下语句无例外地产生NaN (非数字)。 System.out.println(0D/0); //or 0.0/0, or 0.0/0.0 or 0/0.0 - floating point arithmetic. 在这种情况下,两个操作数都被视为双精度。 同样,以下语句也不会引发任何异常。 double div1 = 0D/0; //or 0D/0D double div2 = 0/0D; //or 0D/0D System.out.printf("div1 = %s : div2 = %s%n", div1, div2); System.out.printf("div1 == div2 : %b%n", div1 ==
  • 异常对Java性能的影响是什么?(What are the effects of exceptions on performance in Java?)
    问题 问题:Java中的异常处理是否真的很慢? 传统观点以及Google的许多研究结果都表明,不应将特殊逻辑用于Java中的常规程序流程。 通常有两个原因, 它确实很慢-甚至比常规代码慢一个数量级(给出的原因各不相同), 和 这是混乱的,因为人们期望仅在异常代码中处理错误。 这个问题是关于#1的。 例如,此页面将Java异常处理描述为“非常慢”,并将这种缓慢与异常消息字符串的创建相关联-“然后,此字符串用于创建抛出的异常对象。这不是很快。” Java中的有效异常处理文章说:“其原因是由于异常处理的对象创建方面,因此使固有的异常抛出速度变慢”。 另一个原因是堆栈跟踪的生成会减慢堆栈跟踪的速度。 我的测试(在32位Linux上使用Java 1.6.0_07,Java HotSpot 10.0)表明异常处理并不比常规代码慢。 我尝试在执行一些代码的循环中运行方法。 在方法的最后,我使用一个布尔值来指示是返回还是throw 。 这样,实际处理是相同的。 我尝试以不同的顺序运行方法并平均测试时间,以为可能是JVM变暖了。 在我所有的测试中,投掷速度至少与返回速度一样快,甚至不快(高达3.1%)。 我完全可以接受我的测试错误的可能性,但是我并没有看到代码样本,测试比较或最近一两年中显示Java异常处理的结果的任何方式。慢。 导致我走这条路的是我需要使用的将异常作为常规控制逻辑的一部分的API。
  • 我可以在同一catch子句中捕获多个Java异常吗?(Can I catch multiple Java exceptions in the same catch clause?)
    问题 在Java中,我想做这样的事情: try { ... } catch (/* code to catch IllegalArgumentException, SecurityException, IllegalAccessException, and NoSuchFieldException at the same time */) { someCode(); } ...代替: try { ... } catch (IllegalArgumentException e) { someCode(); } catch (SecurityException e) { someCode(); } catch (IllegalAccessException e) { someCode(); } catch (NoSuchFieldException e) { someCode(); } 有什么办法吗? 回答1 从Java 7开始,这是可能的。多捕获块的语法为: try { ... } catch (IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e) { someCode(); } 但是请记住,如果所有异常都属于同一类层次结构
  • 如何从Java 8流中引发CHECKED异常?(How can I throw CHECKED exceptions from inside Java 8 streams?)
    问题 如何从Java 8流/ lambda中抛出CHECKED异常? 换句话说,我想使代码像这样编译: public List<Class> getClasses() throws ClassNotFoundException { List<Class> classes = Stream.of("java.lang.Object", "java.lang.Integer", "java.lang.String") .map(className -> Class.forName(className)) .collect(Collectors.toList()); return classes; } 由于上面的Class.forName()方法抛出ClassNotFoundException ,因此该代码无法编译。 请注意,我不想将已检查的异常包装在运行时异常中,而是抛出已包装的未检查的异常。 我想抛出检查异常本身,而无需添加丑陋try / catches到流。 回答1 您问题的简单答案是:您不能,至少不能直接这样做。 这不是你的错。 甲骨文搞砸了。 他们坚持使用检查异常的概念,但是在设计功能接口,流,lambda等时,始终不一致地忘记照顾检查异常。这对像Robert C. Martin这样的专家小组来说都是明智的选择,他们将检查异常称为失败的实验。 在我看来
  • 10.Java异常问题
    目录介绍 10.0.0.1 见过哪些运行时异常?异常处理机制知道哪些?从异常是否必须需要被处理的角度来看怎么分类? 10.0.0.2 运用Java异常处理机制?异常处理的原理?Java中检查异常和非检查异常的区别? 10.0.0.3 异常处理的过程中,你遵循那些好的实践? throw 和 throws这两个关键字在java中有什么不同? 10.0.0.4 你知道什么是“异常链”吗?自定义实现过哪些异常,怎么写的?可以有一个空的catch块吗? 10.0.0.5 Java异常类有哪些的重要方法?导致“主线程中的异常”的不同场景是什么? 10.0.0.6 看下面这段子类继承父类代码有什么问题?针对抛异常是IOException还是Exception,能随便写吗,结合案例说一下? 10.0.0.7 捕获异常时,为何在catch中要注意异常层级关系?需要注意哪些问题? 好消息 博客笔记大汇总【15年10月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,长期更新维护并且修正,持续完善……开源的文件是markdown格式的!同时也开源了生活博客,从12年起,积累共计500篇[近100万字],将会陆续发表到网上,转载请注明出处,谢谢! 链接地址:https://github.com
  • 在catch和finally子句中引发异常(Exception thrown in catch and finally clause)
    问题 在大学里一个关于Java的问题中,有以下代码片段: class MyExc1 extends Exception {} class MyExc2 extends Exception {} class MyExc3 extends MyExc2 {} public class C1 { public static void main(String[] args) throws Exception { try { System.out.print(1); q(); } catch (Exception i) { throw new MyExc2(); } finally { System.out.print(2); throw new MyExc1(); } } static void q() throws Exception { try { throw new MyExc1(); } catch (Exception y) { } finally { System.out.print(3); throw new Exception(); } } } 我被要求提供其输出。 我13Exception in thread main MyExc2回答了13Exception in thread main MyExc2 ,但正确的答案是132Exception in thread
  • 如何在Java中使用PrintWriter和File类?(How to use PrintWriter and File classes in Java?)
    问题 我试图了解我正在制作的一个小程序的PrintWriter,但似乎无法让Java来制作文件然后在上面写。 当我执行下面的程序时,它在第9行给出了Filenotfoundexeption错误。它也无法在我指定的目录中创建文件。 我对此并不陌生,因此请尝试使答案保持简单。 我正在使用Eclipse。 import java.io.PrintWriter; import java.io.File; public class Testing { public static void main(String[] args) { File file = new File ("C:/Users/Me/Desktop/directory/file.txt"); PrintWriter printWriter = new PrintWriter ("file.txt"); printWriter.println ("hello"); printWriter.close (); } } 回答1 如果该目录不存在,则需要创建它。 Java不会自己创建它,因为File类只是一个实体的链接,而该实体也根本不存在。 如您所述,错误是无法创建文件。 如果您阅读PrintWriter构造函数的文档,则可以看到 FileNotFoundException-如果给定的字符串不表示现有的可写常规文件
  • 什么时候抛出异常?(When to throw an exception?)
    问题 我为我的应用程序不希望遇到的每种情况都创建了异常。 UserNameNotValidException , PasswordNotCorrectException等。 但是,我被告知我不应该为这些条件创建例外。 在我的UML中,那些是主流的例外,那么为什么不应该例外呢? 有关创建例外情况的任何指导或最佳做法? 回答1 我的个人指导原则是:当发现当前代码块的基本假设为假时,将引发异常。 示例1:说我有一个函数,应该检查一个任意类,如果该类继承自List <>,则返回true。 该函数会询问以下问题:“此对象是List的后代吗?” 此函数永远不会抛出异常,因为它的操作中没有灰色区域-每个类都可以从List <>继承或不从List <>继承,因此答案始终是“是”或“否”。 示例2:说我有另一个函数,该函数检查List <>,如果长度大于50,则返回true,如果长度小于50,则返回false。 此功能会询问以下问题:“此列表是否包含50多个项目?” 但是这个问题是一个假设-它假设给定的对象是一个列表。 如果我将其设置为NULL,则该假设为假。 在这种情况下,如果该函数返回truefalse,那么它是打破自己的规则。 该函数无法返回并声称它已正确回答了问题。 因此它不会返回-引发异常。 这可与“加载的问题”逻辑谬误相提并论。 每个功能都会问一个问题。 如果给出了输入
  • Java为什么不允许从静态初始化块中引发检查异常?(Why doesn't Java allow to throw a checked exception from static initialization block?)
    问题 Java为什么不允许从静态初始化块中引发检查异常? 这个设计决定背后的原因是什么? 回答1 因为无法在源中处理这些检查的异常。 您对初始化过程没有任何控制,并且无法从源代码中调用static {}块,因此可以用try-catch包围它们。 由于您无法处理由检查的异常指示的任何错误,因此决定禁止抛出检查的异常静态块。 静态块不得引发已检查的异常,但仍允许引发未检查的/运行时异常。 但是根据上述原因,您也将无法处理这些问题。 总而言之,此限制可防止(或至少使开发人员更难)构建可能会导致错误的应用程序无法恢复的东西。 回答2 您可以通过捕获任何已检查的异常并将其作为未检查的异常重新抛出来解决该问题。 此未经检查的异常类可以很好地用作包装器:java.lang.ExceptionInInitializerError。 样例代码: protected static class _YieldCurveConfigHelperSingleton { public static YieldCurveConfigHelper _staticInstance; static { try { _staticInstance = new YieldCurveConfigHelper(); } catch (IOException | SAXException | JAXBException e) {
  • 在函数签名中抛出关键字(Throw keyword in function's signature)
    问题 在函数签名中使用C ++ throw关键字被认为是不好的做法的技术原因是什么? bool some_func() throw(myExc) { ... if (problem_occurred) { throw myExc("problem occurred"); } ... } 回答1 不,这不是一种好的做法。 相反,通常认为这是一个坏主意。 http://www.gotw.ca/publications/mill22.htm进一步详细说明了原因,但是部分原因是编译器无法强制执行此操作,因此必须在运行时对其进行检查,这通常是不合要求的。 而且在任何情况下都无法很好地支持它。 (MSVC忽略了异常规范,throw()除外,它被解释为保证不会引发异常的保证。 回答2 Jalf已经链接了它,但是GOTW很好地说明了为什么异常规范没有人们希望的有用: int Gunc() throw(); // will throw nothing (?) int Hunc() throw(A,B); // can only throw A or B (?) 评论正确吗? 不完全的。 Gunc()确实可能会抛出一些东西,而Hunc()可能会抛出除A或B之外的其他东西! 编译器只是保证在它们发生错误时击败他们……哦,并且在大多数情况下也使您的程序也无法理解。 这就是它的最终结果
  • Java 8:Lambda-Streams,按方法进行过滤(异常)(Java 8: Lambda-Streams, Filter by Method with Exception)
    问题 我在尝试Java 8的Lambda表达式时遇到问题,通常可以正常工作,但是现在我有抛出IOException的方法。 最好查看以下代码: class Bank{ .... public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } .... } interface Account{ .... boolean isActive() throws IOException; String getNumber() throws IOException; .... } 问题是,它无法编译,因为我必须捕获isActive-和getNumber-Methods的可能异常。 但是,即使我显式使用了如下所示的try-catch-Block,它仍然无法编译,因为我没有捕获到Exception。 因此,要么JDK中存在错误,要么我不知道如何捕获这些异常。 class Bank{ .... /
  • 在Java中,什么时候应该创建一个检查的异常,什么时候应该是一个运行时异常? [复制](In Java, when should I create a checked exception, and when should it be a runtime exception? [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 何时选择已检查和未检查的异常 什么时候应该创建一个受检查的异常,什么时候应该创建一个运行时异常? 例如,假设我创建了以下类: public class Account { private float balance; /* ... constructor, getter, and other fields and methods */ public void transferTo(Account other, float amount) { if (amount > balance) throw new NotEnoughBalanceException(); /* ... */ } } 我应该如何创建NotEnoughBalanceException ? 它应该扩展Exception或RuntimeException吗? 还是应该改用IllegalArgumentException ? 回答1 在这个话题上有很多分歧。 在我的上一份工作中,我们遇到了一些实际问题,运行时异常被遗忘了直到它们出现在生产环境中(在ageswards.com上),因此我们决定只使用检查异常。 在我目前的工作中,我发现在很多情况下都有很多人遇到运行时异常。 我的想法是:使用CheckedExceptions
  • 是否为空参数提供IllegalArgumentException或NullPointerException? [关闭](IllegalArgumentException or NullPointerException for a null parameter? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 改善这个问题 我为属性提供了一个简单的setter方法,并且null不适合此特定属性。 在这种情况下,我总是感到痛苦:我应该抛出IllegalArgumentException还是NullPointerException? 从javadocs来看,两者似乎都合适。 有某种可以理解的标准吗? 还是这只是您应该做的任何事情之一,而且两者都是正确的? 回答1 如果您不希望将null用作允许的值,则似乎调用了IllegalArgumentException ,并且如果您尝试使用一个结果为null的变量,则将引发NullPointerException 。 回答2 You should be using IllegalArgumentException (IAE), not NullPointerException (NPE) for the following reasons: First, the NPE JavaDoc explicitly lists the cases where NPE is appropriate. Notice that all of them are thrown by the runtime when
  • 不抛出异常时,try / catch块是否会损害性能?(Do try/catch blocks hurt performance when exceptions are not thrown?)
    问题 在与Microsoft员工进行代码审查期间,我们在try{}块内遇到了很大一部分代码。 她和一位IT代表建议,这可能会影响代码的性能。 实际上,他们建议大多数代码应位于try / catch块之外,并且仅应检查重要部分。 微软员工补充说,即将发布的白皮书警告不要尝试错误的try / catch块。 我环顾四周,发现它会影响优化,但它似乎仅在范围之间共享变量时才适用。 我不是在问代码的可维护性,甚至不是在处理正确的异常(毫无疑问,有问题的代码都需要重构)。 我也不是指使用异常进行流控制,这在大多数情况下显然是错误的。 这些是重要的问题(有些更重要),但这里不是重点。 不抛出异常时,try / catch块如何影响性能? 回答1 核实。 static public void Main(string[] args) { Stopwatch w = new Stopwatch(); double d = 0; w.Start(); for (int i = 0; i < 10000000; i++) { try { d = Math.Sin(1); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } w.Stop(); Console.WriteLine(w.Elapsed); w.Reset(); w
  • 2021-03-29
    标题重写过程中应当遵守的 12 条规则。 01、什么是重写? 重写带来了一种非常重要的能力,可以让子类重新实现从超类那继承过来的方法。在下面这幅图中,Animal 是父类,Dog 是子类,Dog 重新实现了 move() 方法用来和父类进行区分,毕竟狗狗跑起来还是比较有特色的。 重写的方法和被重写的方法,不仅方法名相同,参数也相同,只不过,方法体有所不同。 02、哪些方法可以被重写? 规则一:只能重写继承过来的方法。 因为重写是在子类重新实现从父类继承过来的方法时发生的,所以只能重写继承过来的方法,这很好理解。这就意味着,只能重写那些被 public、protected 或者 default 修饰的方法,private 修饰的方法无法被重写。 Animal 类有 move()、eat() 和 sleep() 三个方法: public class Animal { public void move() { } protected void eat() { } void sleep(){ } } Dog 类来重写这三个方法: public class Dog extends Animal { public void move() { } protected void eat() { } void sleep(){ } } 完全没有问题。但如果父类中的方法是 private 的
  • Swift语言中的错误处理(Error-Handling in Swift-Language)
    问题 我对Swift的了解还不够多,但是我注意到的一件事是,没有例外。 那么如何在Swift中进行错误处理呢? 有没有人发现任何与错误处理相关的信息? 回答1 斯威夫特2&3 Swift 2中的情况发生了一些变化,因为有一个新的错误处理机制,该机制与异常有些相似,但在细节上有所不同。 1.指示错误可能性 如果函数/方法想要表明它可能会抛出错误,则应包含throws关键字,如下所示 func summonDefaultDragon() throws -> Dragon 注意:函数没有实际抛出的错误类型的规范。 该声明仅声明该函数可以抛出实现ErrorType的任何类型的实例,或者根本不抛出该实例。 2.调用可能引发错误的功能 为了调用函数,您需要使用try关键字,例如 try summonDefaultDragon() 这条线通常应该像这样出现在do-catch块中 do { let dragon = try summonDefaultDragon() } catch DragonError.dragonIsMissing { // Some specific-case error-handling } catch DragonError.notEnoughMana(let manaRequired) { // Other specific-case error-handlng }
  • 为什么在Java中将Integer与int进行比较会抛出NullPointerException?(Why comparing Integer with int can throw NullPointerException in Java?)
    问题 观察到这种情况令我非常困惑: Integer i = null; String str = null; if (i == null) { //Nothing happens ... } if (str == null) { //Nothing happens } if (i == 0) { //NullPointerException ... } if (str == "0") { //Nothing happens ... } 因此,我认为装箱操作首先执行(即java尝试从null提取int值),并且比较操作的优先级较低,这就是引发异常的原因。 问题是:为什么在Java中以这种方式实现它? 为什么装箱比比较参考具有更高的优先级? 还是为什么他们没有在装箱前实施针对null验证? 目前,当NullPointerException与包装的原语一起抛出,而不与真实的对象类型一起抛出时,它看起来不一致。 回答1 简短答案 关键是: 两个参考类型之间的==始终是参考比较通常,例如,使用Integer和String ,您想使用equals代替引用类型和数字原始类型之间的==始终是数字比较参考类型将进行拆箱转换取消装箱null始终会引发NullPointerException 尽管Java对String有许多特殊处理,但实际上它不是原始类型 上面的语句适用于任何给定的有效Java代码。
  • 了解Java中检查与未检查的异常(Understanding checked vs unchecked exceptions in Java)
    问题 约书亚·布洛赫(Joshua Bloch)在《有效的Java 》中说 将检查的异常用于可恢复的条件,将运行时异常用于编程错误(第二版中的项目58) 让我们看看我是否正确理解了这一点。 这是我对检查异常的理解: try{ String userInput = //read in user input Long id = Long.parseLong(userInput); }catch(NumberFormatException e){ id = 0; //recover the situation by setting the id to 0 } 1.以上是否被视为经过检查的异常? 2. RuntimeException是未经检查的异常吗? 这是我对未经检查的异常的理解: try{ File file = new File("my/file/path"); FileInputStream fis = new FileInputStream(file); }catch(FileNotFoundException e){ //3. What should I do here? //Should I "throw new FileNotFoundException("File not found");"? //Should I log? //Or should I System
  • 异常&线程习题
    基础题 练习一:异常的体系 问题: 请描述异常的继承体系请描述你对错误(Error)的理解请描述你对异常(Expection的理解)请描述你对运行时异常(RuntimeException)的理解 答: 异常继承体系为:异常的根类是 java.lang.Throwable,其下有两个子类: java.lang.Error 与 java.util.Exception 。而Exception又分为编译时期异常:checked异常,与运行时期异常:runtime异常。 Error:表示不可修复的恶性的错误,只能通过修改代码规避错误的产生,通常是系统级别的,所以很严重。Exception:表示可修复的良性(相对于错误)的异常,异常产生后程序员可以并且应该通过代码的方式纠正,使程序继续运行,是必须要处理的。运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。 练习二:throw与throws的区别 问题: 请描述throw的使用位置,作用是什么?请描述throws的使用位置,作用是什么? 答: throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常
  • 什么是堆栈跟踪,如何使用它来调试应用程序错误?(What is a stack trace, and how can I use it to debug my application errors?)
    问题 有时,当我运行我的应用程序时,它给我一个错误,看起来像: Exception in thread "main" java.lang.NullPointerException at com.example.myproject.Book.getTitle(Book.java:16) at com.example.myproject.Author.getBookTitles(Author.java:25) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) 人们将其称为“堆栈跟踪”。 什么是堆栈跟踪? 关于程序中发生的错误,它能告诉我什么? 关于这个问题-我经常看到一个问题,这个问题是新手程序员在“遇到错误”时遇到的,他们只是粘贴了堆栈跟踪和一些随机的代码块,而不了解堆栈跟踪是什么或如何使用它。 该问题旨在为可能需要帮助来了解堆栈跟踪值的新手程序员提供参考。 回答1 简单来说,堆栈跟踪是在抛出Exception时应用程序处于中间的方法调用的列表。 简单的例子 通过问题中给出的示例,我们可以准确确定在应用程序中引发异常的位置。 让我们看一下堆栈跟踪: Exception in thread "main" java.lang.NullPointerException at com.example.myproject