J2ME图片路径问题

时间:2021-03-27 03:23:28
Image imageLogo;
imageLogo=Image.createImage("/Images/pic.png");
g.drawImage(imageLogo,0,20,Graphics.TOP|Graphics.LEFT);
src文件夹中有Images文件夹,Images中有pic.png
请高手看看为什么会出现Uncaught exception java/lang/OutOfMemoryError.异常.
谢谢拉!!!!!!!!

11 个解决方案

#1



你图片路径应该不对呀,应该得报空指针,可居然报的是内存暴了
用的是eclipse吗?图片多大?除了读图外还有其他操作没?

#2


用的是NetBeans 图片600KB左右,我在网上查时,好像就是吧图片放在src文件夹中..应该只有读图片的操作吧,下面是我程序的代码,麻烦帮我看看拉.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class CanvasDrawTest extends MIDlet implements CommandListener{
    private Command exitCommand,aCommand0,aCommand1,aCommand2,aCommand3,aCommand4,aCommand5;
    private DemoCanvas myCanvas;
    public CanvasDrawTest(){
        exitCommand=new Command("Exit",Command.EXIT,2);
        aCommand0=new Command("坐标移动演示",Command.SCREEN,3);
        aCommand1=new Command("对齐演示",Command.SCREEN,3);
        aCommand2=new Command("弧线与填充",Command.SCREEN,3);
        aCommand3=new Command("扇形图",Command.SCREEN,3);
        aCommand4=new Command("线条演示",Command.SCREEN,3);
        aCommand5=new Command("图形显示",Command.SCREEN,3);
        myCanvas=new DemoCanvas();
        myCanvas.addCommand(exitCommand);
        myCanvas.addCommand(aCommand0);
        myCanvas.addCommand(aCommand1);
        myCanvas.addCommand(aCommand2);
        myCanvas.addCommand(aCommand3);
        myCanvas.addCommand(aCommand4);
        myCanvas.addCommand(aCommand5);
        myCanvas.setCommandListener(this);
    }
    public void startApp() {
        Display.getDisplay(this).setCurrent(myCanvas);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    public void commandAction(Command c,Displayable d){
        if(c==exitCommand)
        {
            destroyApp(false);
            notifyDestroyed();
        }
        else if(c==aCommand0)
        {
            myCanvas.demoType=0;
            myCanvas.textShow="坐标移动演示";
            myCanvas.repaint();
        }
        else if(c==aCommand1)
        {
            myCanvas.demoType=1;
            myCanvas.textShow="对齐演示";
            myCanvas.repaint();
        }
        else if(c==aCommand2)
        {
            myCanvas.demoType=2;
            myCanvas.textShow="弧线与填充";
            myCanvas.repaint();
        }
        else if(c==aCommand3)
        {
            myCanvas.demoType=3;
            myCanvas.textShow="扇形图";
            myCanvas.repaint();
        }
        else if(c==aCommand4)
        {
            myCanvas.demoType=4;
            myCanvas.textShow="线条演示";
            myCanvas.repaint();
        }
        else if(c==aCommand5)
        {
            myCanvas.demoType=5;
            myCanvas.textShow="图片显示";
            myCanvas.repaint();
        }
    }
}


import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.io.*;
public class DemoCanvas extends Canvas{
    public String textShow="坐标移动演示";
    public int demoType=0;
    Image imageLogo;
    private int[] bRGB={0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,};
    /** Creates a new instance of DemoCanvas */
    public DemoCanvas() {
        loadImage();
    }
    public void loadImage(){
        try
        {
            imageLogo=Image.createImage("/Images/pic.png");
        }
        catch(IOException e)
        {
            System.out.println("load png resource error "+e.getMessage());
            imageLogo=null;
        }
    }
    public void paint(Graphics g){
        g.setColor(0xffffff);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0x000000);
        g.drawString(textShow,0,0,Graphics.TOP|Graphics.LEFT);
        if(0==demoType)
            drawType0(g);
        else if(1==demoType)
            drawType1(g);
        else if(2==demoType)
            drawType2(g);
        else if(3==demoType)
            drawType3(g);
        else if(4==demoType)
            drawType4(g);
        else if(5==demoType)
            drawType5(g);
    }
    public void drawType0(Graphics g){
        for(int i=0;i<4;i++){
            g.translate(20,20);
            g.drawString("坐标(0,0)",0,0,Graphics.TOP|Graphics.LEFT);
            System.out.println("coordinate= "+g.getTranslateX()+","+g.getTranslateY());
        }
    }
    public void drawType1(Graphics g){
        g.setColor(0x0000ff);
        g.drawLine(getWidth()/2,0, getWidth()/2, getHeight());
        g.drawLine(0,getHeight()/2, getHeight(), getHeight()/2);
        g.setColor(0x000000);
        g.drawString("TOP_LEFT",getWidth()/2, getHeight()/2,Graphics.TOP|Graphics.LEFT);
        g.drawString("BOTTOM_LEFT",getWidth()/2, getHeight()/2,Graphics.BOTTOM|Graphics.LEFT);
        g.drawString("TOP_RIGHT",getWidth()/2, getHeight()/2,Graphics.TOP|Graphics.RIGHT);
        g.drawString("BOTTOM_RIGHT",getWidth()/2, getHeight()/2,Graphics.BOTTOM|Graphics.RIGHT);
    }
    public void drawType2(Graphics g){
        g.setColor(0x00ff0000);
        g.drawArc(20,30,30,30,0,90);
        g.drawArc(55,30,30,30,0,-180);
        g.drawArc(90,30,30,30,0,360);
        g.setColor(0x0000ff00);
        g.fillArc(20,65,30,30,0,90);
        g.fillArc(55,65,30,30,0,-180);
        g.fillArc(90,65,30,30,0,360);
    }
    public void drawType3(Graphics g){
        g.setColor(0x00ff0000);
        g.fillArc(40,40,110,110,0,130);
        g.setColor(0x0000ff00);
        g.fillArc(40,40,110,110,130,90);
        g.setColor(0x000000ff);
        g.fillArc(40,40,110,110,220,140);
    }
    public void drawType4(Graphics g){
        g.setStrokeStyle(Graphics.SOLID);
        g.setColor(0x00000000); 
        g.drawLine(2,20,20,40);
        g.drawLine(20,40,50,30);
        g.drawLine(50,30,80,70);
        g.drawLine(80,70,110,60);
        g.setStrokeStyle(Graphics.DOTTED);
        g.setColor(0x00ff0000); 
        g.drawLine(2,40,20,40);
        g.drawLine(20,30,50,50);
        g.drawLine(50,50,80,10);
        g.drawLine(80,10,110,40);
    }
     public void drawType5(Graphics g){
         if(null!=imageLogo)
         {
             g.drawImage(imageLogo,0,20,Graphics.TOP|Graphics.LEFT);
         }
     }
}

#3


600K的图...
尺寸多大的?用小图试试。图片尺寸最好在屏幕尺寸的两倍以内。

#4


尺寸是1632*1224
我弄小了试试看

#5


不行啊,图片40KB还是这个异常

#6


和图片文件大小没关。和图片的尺寸大小有关

#7


尺寸也变小了啊,400*300,我在试试

#8


不行,应该跟图片没关系,假如吧imageLogo=Image.createImage("/Images/pic.png"); 
写成imageLogo=Image.createImage("/pic.png");就没这个异常了,但图片没读出来

#9


src存放的是源码
res存放的是图片和声音资源。
请楼主将图片放到res目录下试试

#10


目录里面没有res啊,要自己建吗?

#11


我试出来拉,谢谢各位拉。。。。

#1



你图片路径应该不对呀,应该得报空指针,可居然报的是内存暴了
用的是eclipse吗?图片多大?除了读图外还有其他操作没?

#2


用的是NetBeans 图片600KB左右,我在网上查时,好像就是吧图片放在src文件夹中..应该只有读图片的操作吧,下面是我程序的代码,麻烦帮我看看拉.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;

public class CanvasDrawTest extends MIDlet implements CommandListener{
    private Command exitCommand,aCommand0,aCommand1,aCommand2,aCommand3,aCommand4,aCommand5;
    private DemoCanvas myCanvas;
    public CanvasDrawTest(){
        exitCommand=new Command("Exit",Command.EXIT,2);
        aCommand0=new Command("坐标移动演示",Command.SCREEN,3);
        aCommand1=new Command("对齐演示",Command.SCREEN,3);
        aCommand2=new Command("弧线与填充",Command.SCREEN,3);
        aCommand3=new Command("扇形图",Command.SCREEN,3);
        aCommand4=new Command("线条演示",Command.SCREEN,3);
        aCommand5=new Command("图形显示",Command.SCREEN,3);
        myCanvas=new DemoCanvas();
        myCanvas.addCommand(exitCommand);
        myCanvas.addCommand(aCommand0);
        myCanvas.addCommand(aCommand1);
        myCanvas.addCommand(aCommand2);
        myCanvas.addCommand(aCommand3);
        myCanvas.addCommand(aCommand4);
        myCanvas.addCommand(aCommand5);
        myCanvas.setCommandListener(this);
    }
    public void startApp() {
        Display.getDisplay(this).setCurrent(myCanvas);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
    }
    public void commandAction(Command c,Displayable d){
        if(c==exitCommand)
        {
            destroyApp(false);
            notifyDestroyed();
        }
        else if(c==aCommand0)
        {
            myCanvas.demoType=0;
            myCanvas.textShow="坐标移动演示";
            myCanvas.repaint();
        }
        else if(c==aCommand1)
        {
            myCanvas.demoType=1;
            myCanvas.textShow="对齐演示";
            myCanvas.repaint();
        }
        else if(c==aCommand2)
        {
            myCanvas.demoType=2;
            myCanvas.textShow="弧线与填充";
            myCanvas.repaint();
        }
        else if(c==aCommand3)
        {
            myCanvas.demoType=3;
            myCanvas.textShow="扇形图";
            myCanvas.repaint();
        }
        else if(c==aCommand4)
        {
            myCanvas.demoType=4;
            myCanvas.textShow="线条演示";
            myCanvas.repaint();
        }
        else if(c==aCommand5)
        {
            myCanvas.demoType=5;
            myCanvas.textShow="图片显示";
            myCanvas.repaint();
        }
    }
}


import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import java.io.*;
public class DemoCanvas extends Canvas{
    public String textShow="坐标移动演示";
    public int demoType=0;
    Image imageLogo;
    private int[] bRGB={0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,0x0000ff00,0x0000ff00,0x0000ff00,
    0x0000ff00,0xffff0000,};
    /** Creates a new instance of DemoCanvas */
    public DemoCanvas() {
        loadImage();
    }
    public void loadImage(){
        try
        {
            imageLogo=Image.createImage("/Images/pic.png");
        }
        catch(IOException e)
        {
            System.out.println("load png resource error "+e.getMessage());
            imageLogo=null;
        }
    }
    public void paint(Graphics g){
        g.setColor(0xffffff);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(0x000000);
        g.drawString(textShow,0,0,Graphics.TOP|Graphics.LEFT);
        if(0==demoType)
            drawType0(g);
        else if(1==demoType)
            drawType1(g);
        else if(2==demoType)
            drawType2(g);
        else if(3==demoType)
            drawType3(g);
        else if(4==demoType)
            drawType4(g);
        else if(5==demoType)
            drawType5(g);
    }
    public void drawType0(Graphics g){
        for(int i=0;i<4;i++){
            g.translate(20,20);
            g.drawString("坐标(0,0)",0,0,Graphics.TOP|Graphics.LEFT);
            System.out.println("coordinate= "+g.getTranslateX()+","+g.getTranslateY());
        }
    }
    public void drawType1(Graphics g){
        g.setColor(0x0000ff);
        g.drawLine(getWidth()/2,0, getWidth()/2, getHeight());
        g.drawLine(0,getHeight()/2, getHeight(), getHeight()/2);
        g.setColor(0x000000);
        g.drawString("TOP_LEFT",getWidth()/2, getHeight()/2,Graphics.TOP|Graphics.LEFT);
        g.drawString("BOTTOM_LEFT",getWidth()/2, getHeight()/2,Graphics.BOTTOM|Graphics.LEFT);
        g.drawString("TOP_RIGHT",getWidth()/2, getHeight()/2,Graphics.TOP|Graphics.RIGHT);
        g.drawString("BOTTOM_RIGHT",getWidth()/2, getHeight()/2,Graphics.BOTTOM|Graphics.RIGHT);
    }
    public void drawType2(Graphics g){
        g.setColor(0x00ff0000);
        g.drawArc(20,30,30,30,0,90);
        g.drawArc(55,30,30,30,0,-180);
        g.drawArc(90,30,30,30,0,360);
        g.setColor(0x0000ff00);
        g.fillArc(20,65,30,30,0,90);
        g.fillArc(55,65,30,30,0,-180);
        g.fillArc(90,65,30,30,0,360);
    }
    public void drawType3(Graphics g){
        g.setColor(0x00ff0000);
        g.fillArc(40,40,110,110,0,130);
        g.setColor(0x0000ff00);
        g.fillArc(40,40,110,110,130,90);
        g.setColor(0x000000ff);
        g.fillArc(40,40,110,110,220,140);
    }
    public void drawType4(Graphics g){
        g.setStrokeStyle(Graphics.SOLID);
        g.setColor(0x00000000); 
        g.drawLine(2,20,20,40);
        g.drawLine(20,40,50,30);
        g.drawLine(50,30,80,70);
        g.drawLine(80,70,110,60);
        g.setStrokeStyle(Graphics.DOTTED);
        g.setColor(0x00ff0000); 
        g.drawLine(2,40,20,40);
        g.drawLine(20,30,50,50);
        g.drawLine(50,50,80,10);
        g.drawLine(80,10,110,40);
    }
     public void drawType5(Graphics g){
         if(null!=imageLogo)
         {
             g.drawImage(imageLogo,0,20,Graphics.TOP|Graphics.LEFT);
         }
     }
}

#3


600K的图...
尺寸多大的?用小图试试。图片尺寸最好在屏幕尺寸的两倍以内。

#4


尺寸是1632*1224
我弄小了试试看

#5


不行啊,图片40KB还是这个异常

#6


和图片文件大小没关。和图片的尺寸大小有关

#7


尺寸也变小了啊,400*300,我在试试

#8


不行,应该跟图片没关系,假如吧imageLogo=Image.createImage("/Images/pic.png"); 
写成imageLogo=Image.createImage("/pic.png");就没这个异常了,但图片没读出来

#9


src存放的是源码
res存放的是图片和声音资源。
请楼主将图片放到res目录下试试

#10


目录里面没有res啊,要自己建吗?

#11


我试出来拉,谢谢各位拉。。。。