【问题标题】:Why the stack trace contains repeat call to the parseInt() method?为什么堆栈跟踪包含对 parseInt() 方法的重复调用?
【发布时间】:2020-08-24 12:48:32
【问题描述】:

我用 JDK 11.0 编译了以下代码:

import java.util.Scanner;
public class inputWithScanner {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Enter your name and roll number");
    String name = input.next();
    Integer rollNumber = Integer.parseInt(input.next());
    input.close();
    if (name.isEmpty())
        System.out.println("oops! You didnt enter your name");
    if (rollNumber < 0)
        System.out.println("Enter a valid roll number");
    System.out.println("Hello "+name+" Roll Number   "+rollNumber);

并使用以下输入测试程序(rollNumber 变量的混合输入是故意的):

Enter your name and roll number
Manraj 2018CSE1023

编译器引发异常:NumberFormatException,堆栈跟踪如下:

        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Integer.parseInt(Integer.java:652)
        at java.base/java.lang.Integer.parseInt(Integer.java:770)
        at inputWithScanner.main(inputWithScanner.java:7)

问题是: 为什么会重复调用 parseInt() 方法?

我使用 valueOf() 方法尝试了相同的代码,并使用相同的输入执行了程序。编译器抛出同样的异常,堆栈跟踪如下:

Exception in thread "main" java.lang.NumberFormatException: For input string: "2018CSE1023"
        at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
        at java.base/java.lang.Integer.parseInt(Integer.java:652)
        at java.base/java.lang.Integer.valueOf(Integer.java:983)
        at inputWithScanner.main(inputWithScanner.java:7)

说明 valueOf() 方法调用了 parseInt() 方法。但是为什么 parseInt() 会调用自己呢?

【问题讨论】:

  • 嗨,这是因为2018CSE1023 不是一个有效的数字,并修复此问题。您需要将此变量存储为String
  • 正如我所提到的,问题与堆栈跟踪有关,而不是该程序中的错误。输入故意与预期不同。
  • 当一个方法被重载时,通常将一个重载实现为对另一个重载的调用。这在堆栈跟踪中显示为两个(或更多)具有相同方法名称的连续帧。但这不是同一种方法。

标签: java string exception integer parseint


【解决方案1】:

parseIntdefined

public static int parseInt(String s) throws NumberFormatException {
    return parseInt(s,10); // this is line 770 currently
}

然后在第 652 行(在对 parseInt 的内部调用中)它会引发异常。此时两个参数parseInt 和一个参数之一都在堆栈跟踪中。

简而言之,这是两种不同的方法,一种带有一个参数,一种带有两个调用。

valueOfdefined

public static Integer valueOf(String s, int radix) throws NumberFormatException {
    return Integer.valueOf(parseInt(s,radix));
}

直接调用带有两个参数的版本。

【讨论】:

  • 很高兴知道。谢谢费德里科。
  • 显然,stacktrace 只显示方法名称及其文件名和行号,而不显示 方法签名
猜你喜欢
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2015-06-18
相关资源
最近更新 更多