Java 學習記錄80 — Stack Trace and Call Stack

張小雄
3 min readSep 14, 2021

--

今天要學 Stack Trace and Call Stack

import java.util.Scanner;public class StackTraceAndCallStack {
public static void main(String[] args) {
int result = divide();
System.out.println("x / y = " + result);
}
private static int divide() {
int x = getInt();
int y = getInt();
System.out.println("x is " + x + ", y is " + y);
return x / y;
}
private static int getInt() {
Scanner s = new Scanner(System.in);
System.out.println("Enter an Integer");
return s.nextInt();
}
}

輸出結果:

Enter an Integer

12345678912

Exception in thread “main” java.util.InputMismatchException: For input string: “12345678912”

at java.base/java.util.Scanner.nextInt(Scanner.java:2264)

at java.base/java.util.Scanner.nextInt(Scanner.java:2212)

at StackTraceAndCallStack.getInt(StackTraceAndCallStack.java:19)

at StackTraceAndCallStack.divide(StackTraceAndCallStack.java:10)

at StackTraceAndCallStack.main(StackTraceAndCallStack.java:5)

原來平常不想看的報錯提示,裡面把程序錯在哪寫的非常之清楚

首先閱讀順序是由下往上看,最下方是程序啟動開始執行的地方

我們自己寫的代碼,若是在 Intellij 看的話是藍色的

所以在這例子中,下面三行是藍色的,我們要除錯

從下往上看,到最上排的藍色(倒數第三行)去那邊進行 Bug 處理

也就是說去 getInt() 裡面除錯就好

那具體來說,到底是啥錯勒?

就看 Exception 拋出來的是啥,在這案例中是 InputMismatchException

ctrl 點進去看或者 google 一下就能發現

Thrown by a Scanner to indicate that the token retrieved does not match the pattern for the expected type, or that the token is out of range for the expected type.

原來是參數為不符合預期的 type

又或者是雖然符合預期但 range 超過了

那我這邊打的是數字為啥還會錯,竟然還說我輸入的是 String

一樣點進去看源碼會發現

// The default radix for this scanner
private int defaultRadix = 10;
public int nextInt() {
return nextInt(defaultRadix);
}

原來 defaultRadix 限制 10 位而已

我輸入的 “12345678912” 是11位,range 超過所以就報錯了

本篇代碼

--

--

張小雄
張小雄

Written by 張小雄

記錄成為軟體工程師的過程

No responses yet