【问题标题】:Java program giving stack overflow [duplicate]Java程序给出堆栈溢出[重复]
【发布时间】:2023-03-15 14:59:01
【问题描述】:

在执行期间,问题是堆栈溢出问题,但这是什么!

运行时错误 (NZEC)

线程主 java.lang.StackOverflowError 中的异常 sun.nio.cs.US_ASCII$Encoder.encodeArrayLoop(US_ASCII.java:198) 在 sun.nio.cs.US_ASCII$Encoder.encodeLoop(US_ASCII.java:231) 在 java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:579) 在 sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271) 在 sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125) 在 java.io.OutputStreamWriter.write(OutputStreamWriter.java:207) 在 java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129) 在 java.io.PrintStream.write(PrintStream.java:526) 在 java.io.PrintStream.print(PrintStream.java:669) 在 Solution.solve(Solution.java:22) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:27) 在 Solution.solve(Solution.java:23) 在 Solution.solve(Solution.java:27) 在 Solution.solve(Solution.java:23)

import java.util.*;
public class Solution {
    
    public static void printIncreasingNumber(int n) {
        /* Your class should be named Solution.
         * Don't write main() function.
        * Don't read input, it is passed as function argument.
        * Print output as specified in the question
        */
        int k = 10;
        int N = (int)Math.pow(10,n);//limit
        solve((int)Math.pow(10,n-1),N);
    }
    
    
    static void solve(int j,int n){
        if(j==n){
            return;
        }
        
        if(check(j)){
            System.out.print(j+" ");
            solve(j+1,n);
        }
        else{
            j = increase(j,n);
            solve(j,n);
        }
    }
    
    static boolean check(int k){
        ArrayList<Integer> arr = new ArrayList<>();
        int temp = k;
        while(temp>0){
            arr.add(temp%10);
            temp = temp/10;
        }
        boolean ans = true;
        for(int i=0;i<arr.size()-1;i++){
            if(arr.get(i)<=arr.get(i+1)){
                ans = false;
                return ans;
            }
        }
        return ans;
    }
    
    static int increase(int j,int n){
        int ans = 0;
        for(int i = j;i<n;i++){
            ArrayList<Integer> arr1 = new ArrayList<>();
            int temp = i;
            while(temp>0){
                arr1.add(temp%10);
                temp = temp/10;
            }
            int count = 0;
            for(int i1=0;i1<arr1.size()-1;i1++){
                if(arr1.get(i1)<=arr1.get(i1+1)){
                    count++;
                }
            }
            if(count==0){
                ans = i;
                break;
            }
        }
        return ans;
    }
}

我的主要功能是,

import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        int a;
        Scanner s = new Scanner(System.in);
        a = s.nextInt();
        Solution.printIncreasingNumber(a);
    }

}

【问题讨论】:

  • 我想更正代码。我需要知道问题出在哪里。
  • j
  • 在添加该增加函数之前,此代码运行良好,但添加该函数后出现此问题。

标签: java recursion stack-overflow


【解决方案1】:

您的代码中有几个问题:

  1. 你应该使用if(j&gt;=n){而不是if(j==n){

  2. 看起来函数increase 有错误,因为这个函数返回相同的数字或0(这对于increase 函数来说很奇怪,不是吗?)。例如,如果你调用 printIncreasingNumber(2),当 j = 90 这个函数返回 0 并且你有不定式循环(你从 0 到 90 一次又一次地调用求解函数),

P.S.我建议你使用任何Java调试器进行检查,然后你可以一步一步看到所有的数字。

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 2021-12-14
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多