2013-06-21 46 views
-1

我有一個內存不足的素性測試例程,我想查找它正在嗅探的值,但無法打印出來了!相關的代碼片段:需要在拋出內存錯誤後打印出Catch語句中的值

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) 

的的System.out.println catch子句中不會被調用。 如何打印出有問題的值?

+0

看起來您的循環可以組合起來,而且您也不會在繼續之後顯示標籤引導您到達的位置。 – Makoto

+0

究竟是如何運行異常處理程序代碼?根據定義,你的內存不足,所以沒有更多的內存來處理處理程序需要的任何分配(用於構建異常字符串,回溯等的臨時變量)。 –

+1

拋出的異常究竟在哪裏? Numbers.java:153也許是捕獲的內部線? (我認爲這幾乎是這種情況發生的唯一可能的方式。) –

回答

0

您可以在拋出異常之前添加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); 
}