为什么堆栈跟踪包含对parseInt方法的重复调用?

问题描述

我使用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()会自己调用呢?

解决方法

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));
}

直接用两个参数调用版本。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...