java - 为什么堆栈跟踪包含对 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() 调用它自己呢?
解决方案
parseInt
定义为_
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10); // this is line 770 currently
}
然后在第 652 行(在内部调用内部parseInt
)它抛出一个异常。此时两个参数parseInt
和一个参数之一都在堆栈跟踪中。
简而言之,这是两种不同的方法,一种带有一个参数,一种带有两个调用。
valueOf
定义为_
public static Integer valueOf(String s, int radix) throws NumberFormatException {
return Integer.valueOf(parseInt(s,radix));
}
它直接调用带有两个参数的版本。
推荐阅读
- angular - 如何结合两个 combineLatest?
- python - AttibuteError:“_AppCtxGlobals”对象没有属性“用户”
- html - 我们可以在html中对复选框进行分组吗
- django - 用于服务 Django 应用程序的 Apache 配置不起作用
- gpu - 如何将 OpenACC 数据区域用于结构化数据?
- android - 为什么我创建的每个项目环境都不包含正确的变量(即 PATH)?错误继承的环境?
- github - 启用两因素身份验证后无法推送到 GitHub
- reactjs - 无法将 AdSense 连接到 Gatsby 博客
- c++ - 在c ++中模式匹配之前删除一行中所有字符的最快方法是什么?
- docusignapi - Docusign-RestAPI 以及如何处理启用 SSO 的客户端