2014-02-07 68 views
0

唯一的區別是存在兩個不同的作物位置。 問題是爲什麼我得到這個錯誤?線程「Thread」中的異常java.lang.OutOfMemoryError:請求的數組大小超過VM限制

方法調用

CropRealOriginalImage1 orderName = new CropRealOriginalImage1(); 
     FourAreaCropAgain1 orderNameFirst=new FourAreaCropAgain1(); 
     orderNameFirst.orderNameFirst(); 
     Decode decode= new Decode(); 
     decode.inputImage("C:/TEMP/Image/Embed Image/Four Area/OrderFirst.png"); 
     if(decode.s.equals("")){ 
      System.out.println("OderFirst=null"); 
     }else{ 
      //put b into txt file 
      System.out.println("decode.s" +decode.s); 
     } 

工作:

public void orderNameFirst(){ 
     ImageIcon icon = new ImageIcon("C:/TEMP/Image/Embed Image/Really Original.png"); 
    image = icon.getImage(); 
    image = createImage(new FilteredImageSource(image.getSource(), 
     new CropImageFilter(icon.getIconWidth()-290, 0, 10, 33))); 
      //new CropImageFilter(icon.getIconWidth()/2, icon.getIconHeight()/2, icon.getIconWidth()/2, icon.getIconHeight()/2))); 

    BufferedImage bufferedImage = new BufferedImage(icon.getIconWidth(), 
      icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(icon.getImage(), 0, 0, null); 

    Graphics2D g = bufferedImage.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillRect(icon.getIconWidth()-290, 0, 10, 33); 

} 

不起作用

public void orderNameFirst(){ 
     ImageIcon icon = new ImageIcon("C:/TEMP/Image/Embed Image/Really Original.png"); 
    image = icon.getImage(); 
    image = createImage(new FilteredImageSource(image.getSource(), 
     new CropImageFilter(3*icon.getIconWidth()/8, 0, icon.getIconWidth()/8, icon.getIconHeight()/2))); 
      //new CropImageFilter(icon.getIconWidth()/2, icon.getIconHeight()/2, icon.getIconWidth()/2, icon.getIconHeight()/2))); 

    BufferedImage bufferedImage = new BufferedImage(icon.getIconWidth(), 
      icon.getIconHeight(), BufferedImage.TYPE_INT_RGB); 
    Graphics graphics = bufferedImage.getGraphics(); 
    graphics.drawImage(icon.getImage(), 0, 0, null); 

    Graphics2D g = bufferedImage.createGraphics(); 
    g.setColor(Color.WHITE); 
    g.fillRect(3*icon.getIconWidth()/8, 0, icon.getIconWidth()/8, icon.getIconHeight()/2); 
    } 

錯誤:解碼integerLength:2147483647 異常的線程「主題」 java.lang.OutOfMemoryError:要求數組大小超過VM限制

+0

你忘了問一個問題 – Durandal

+0

請求的數組大小超過VM限制 - 看起來很明顯。 –

+0

(除了實際提出問題之外,還應該將異常堆棧跟蹤複製到您的問題中,並確定代碼中與異常相對應的行。) –

回答

2

免責聲明:這可能不是你想要的答案,但是這是你問什麼。

The question is why i get this error??

你得到的錯誤:

Exception in thread "Thread" java.lang.OutOfMemoryError: Requested array size exceeds VM limit 

...因爲你要創建一個數組,它是不是在你的Java虛擬機的堆內存的最大連續塊大。發生這種情況的原因可能是因爲您試圖創建大型圖像,或者您嘗試分配陣列時虛擬機通常資源不足。

這很可能發生在BufferedImage構造函數之一內。

但是很難說,因爲您沒有發佈完整的堆棧跟蹤,也沒有在運行時在您的程序中實際傳遞的圖像大小或其他值的相關信息。

該修復取決於內存用完的原因。

舉例來說,我可以從您的代碼中看到,您從不會在您創建的Graphics/Graphics2D實例上調用dispose。這可能會導致資源泄漏(只是一個例子,可能有其他的)。

如果您立即用完內存,因爲映像很大,您需要增加最大堆大小。這通常是通過將-Xmx<value>參數傳遞給java命令行(其中<value>是新的最大大小,如256m1G或類似的)來完成的。

相關問題