【问题标题】:Need to print out value in Catch statement after a thrown out of memory error [duplicate]在抛出内存不足错误后需要在 Catch 语句中打印值 [重复]
【发布时间】:2013-06-21 15:48:37
【问题描述】:

我有一个内存不足的素数测试例程,我想找到它正在吐出的值,但我无法打印出来!相关代码片段:

try{
            // truncate left to right
            for( int xTruncation = 1; xTruncation < lenValue; xTruncation++ ){
                integerValue[0]--;
                long value = Arithmetic.integerToLong10( integerValue );
                if( ! Numbers.primeIs( value ) ) continue NextPermutation; // the number is not prime
            }
            integerValue[0] = lenValue; // restore length

            // truncate right to left
            for( int xTruncation = 1; xTruncation < lenValue; xTruncation++ ){
                Arithmetic.integerReduce( integerValue, 1 );
                long value = Arithmetic.integerToLong10( integerValue );
                if( ! Numbers.primeIs( value ) ) continue NextPermutation; // the number is not prime
            }
} catch( Throwable t ) {
    System.out.println( "last value: " + nValue );
}

这是输出:

23
37
73
313
317
373
797
3137
3797
739397
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at cra.common.Numbers_jsc.factor(Numbers.java:153)
    at cra.common.Numbers_jsc.primeIs(Numbers.java:78)
    at Euler50.Euler_37(Euler50.java:803)
    at Euler50.main(Euler50.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

catch 子句中的 System.out.println 永远不会被调用。 如何打印出有问题的值?

【问题讨论】:

  • 您的循环似乎可以合并,并且在继续后您也没有显示标签将您带到哪里。
  • 异常处理程序代码究竟如何运行?根据定义,你的内存已经用完了,所以没有更多的内存来执行处理程序需要的任何分配(用于构建异常字符串、回溯等的临时变量)。
  • 异常到底是在哪里抛出的? Numbers.java:153 可能是捕获中的那一行吗? (我认为这几乎是发生这种情况的唯一可能方式。)
  • 这不是重复的,我知道如何捕捉错误,问题是捕捉到错误后如何打印。
  • 基本问题是,当您捕获异常时,已经没有足够的空间来做任何事情了。您有时可以通过预分配大量存储空间(几个小/中型对象与一个大对象)来规避这种情况,然后在尝试打印之前将对该存储的引用归零。

标签: java exception memory


【解决方案1】:

您可以在抛出异常之前添加System.out.println。例如:

try{
            // truncate left to right
            for( int xTruncation = 1; xTruncation < lenValue; xTruncation++ ){
                integerValue[0]--;

                System.out.println( "integerValue: " + integerValue );
                long value = Arithmetic.integerToLong10( integerValue );
                System.out.println( "value: " + value );
                if( ! Numbers.primeIs( value ) ) continue NextPermutation; // the number is not prime
            }
            integerValue[0] = lenValue; // restore length

            // truncate right to left
            for( int xTruncation = 1; xTruncation < lenValue; xTruncation++ ){
                Arithmetic.integerReduce( integerValue, 1 );
                System.out.println( "integerValue: " + integerValue );
                long value = Arithmetic.integerToLong10( integerValue );
                System.out.println( "value: " + value );
                if( ! Numbers.primeIs( value ) ) continue NextPermutation; // the number is not prime
            }
} catch( Throwable t ) {
    System.out.println( "last value: " + nValue );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 2013-09-23
    • 2017-01-18
    • 2014-03-05
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多