1. 程式人生 > >Java 無意識遞迴

Java 無意識遞迴

之前在練習中碰到一個問題,程式中沒有使用遞迴卻出現了 Exception in thread “main” java.lang.StackOverflowError 異常,先把之前的程式碼貼上來:

public class InfiniteRecursion {
    public String toString() {
        return "InfiniteRecursion address" + this + "\n";
    }

    public static void main(String[] args) {
        InfiniteRecursion infiniteRecursion = new
InfiniteRecursion(); System.out.println(infiniteRecursion.toString()); } }

程式希望打印出 InfiniteRecursion address+“類記憶體地址”的格式,結果卻出現了異常,分析一下為什麼會出現這種情況:

首先,toString中this要跟前面的字串連線,會進行自動型別轉換,也就是要呼叫該類的toString方法,而該類重寫了父類Object的toString
方法,所以就會直接呼叫該類的toString方法,結果每一次呼叫toString都會引發繼續呼叫toString方法的邏輯,即無意識遞迴,導致出現 StackOverflowError 異常,所以如果想在toString 中列印類記憶體地址,可以通過super關鍵字直接呼叫父類的方法,即Object.toString(),修改後的程式碼如下:

public class InfiniteRecursion {
    public String toString() {
        return "InfiniteRecursion address" + super.toString() + "\n";
    }

    public static void main(String[] args) {
        InfiniteRecursion infiniteRecursion = new InfiniteRecursion();
        System.out.println(infiniteRecursion.toString());
    }
}

相關推薦

Java 意識

之前在練習中碰到一個問題,程式中沒有使用遞迴卻出現了 Exception in thread “main” java.lang.StackOverflowError 異常,先把之前的程式碼貼上來: public class InfiniteRecursio

Think in Java——意識

public class Main { public String toString() { return this + "\n"; } public static void main(String[] args) {

Java中使用

遇到一個問題,給出一個數字,比如10,就算出10×9×8×7……×2×1的結果。 第一個想到的方法: public static int jisuan(int x) { int r = 1; for (int i = 0; i < x; i++) { r =

java tree 結構查詢

create table TB_TREE ( CID NUMBER not null, CNAME VARCHAR2(50), PID NUMBER //父節點 ) insert into tb_tree (CID, CNAME, PID) values (1, '中國', 0);

Java:利用方法實現角谷定理

問題描述:        角谷定理。輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算後,總可以得到自然數值1。求經過多少次可得到自然數1。 如:輸入22, 輸出 22 11 34 17 52 26 1

Java:利用方法求鴨子數

問題描述:        一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子的一半又一隻。這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少隻鴨子?經過每個村子賣出多少隻鴨子? 題目分析:      設經過第n

Java:利用求解分桔子問題

問題描述:        日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完 後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同

java基礎篇———————— 控制及漢諾塔

一: 遞迴控制: 1:遞迴:就是程式一層一層呼叫自身,從而將問題規模層層減小,解除結果; (1)遞迴必須要滿足的兩個條件: .子問題須與原始問題為同樣的事,且更為簡單; .不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。 ( 2 )遞迴的優缺點: 優點: 遞迴語句簡單。 缺點:遞迴是

java:File類練習(按層級列印)

從鍵盤接收一個資料夾路徑,把資料夾中的所有檔案以及資料夾的名字按層級列印, 例如:     aaa是資料夾,裡面有bbb.txt,ccc.txt,ddd.txt這些檔案,有eee這樣的資料夾,eee中有fff.txt和ggg.txt,打印出層級來  &nb

java:File類練習(拷貝)

從鍵盤接收兩個資料夾路徑,把其中一個資料夾中(包含內容)拷貝到另一個資料夾中  package com.heima.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; imp

java:File類練習(刪除該資料夾)

從鍵盤接收一個資料夾路徑,刪除該資料夾 package com.heima.test; import java.io.File; import java.util.Scanner; public class Test2 { public static void main(String

java:File類練習(統計該資料夾大小)

package com.heima.test; import java.io.File; import java.util.Scanner; public class Test1 { public static void main(String[] args) { File dir=

java排列組合實現

import java.util.Scanner; public class combination { public static int k1=0; //計數k1 public static int k2=0;

8皇后以及N皇后演算法探究,回溯演算法的JAVA實現,方案(一)

八皇后問題,是一個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯·貝瑟爾於1848年提出:在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。 高斯認為有76種方案。1854年在柏林的象棋雜誌

Java淺談的理解

      遞迴方法其實就是一個直接或者間接呼叫自己的方法,是一個簡單、實用的方法,在遇到某些不好解決的問題時,可以用遞迴方法來解決,比如:求一段連續自然數之間的和、階乘等等。下面我簡單講講遞迴方法到底是怎麼個情況。       先來一段程式碼: public clas

Java面向物件——

求一個案例:分別用遞迴方法和非遞迴方法求n*(n-1)*(n-2)...3*2*1; 非遞迴方式:用迴圈求解 package Hello; public class Test { static int NotDiGui(int n){ int result=1;

Java中的

1、關於遞迴的認知 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解

24點遊戲演算法 (暴力破解)

題目描述 問題描述:給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利 輸入: 4個1-10的數字。[數字允許重複,但每個數字僅允許使用一次,測試用例保證無異常數字] 輸出: true or false 輸入描述: 輸入4個int整數 輸出描述: 返

關於Java中的操作--(以將一個正整型十進位制數轉換為二進位制數為例)

遞迴操作是函式一直在呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式

java IO 用刪除目錄

package delectDemo1; import java.io.File; import java.io.IOException; /* * 用遞迴刪除資料夾 */ public class DelectFolder { public static vo