Java.lang.NullPointerException при использовании извлеченного изображения (если метод не используется статически!) - PullRequest
1 голос
/ 19 марта 2010

В моем MIDLet у меня есть экземпляр java-класса ImageFetcher с именем anImg. Также в моем MIDLet у меня есть команда, которая просто говорит fetch, CommandListener, который при нажатии выбирает fetch, запускает функцию ниже. Эта функция должна просто запустить public getImage () из экземпляра anImg класса ImageFetcher, который возвращает изображение и затем добавляет / устанавливает это изображение в форму на дисплее. (Вы можете узнать функцию getImage () из Nokia JavaME Wiki !!!)

Вместо любого отображаемого изображения это записывается на выходной терминал в NetBeans: Сообщение: Java.lang.NullPointerException

ОДНАКО, если я заменил public getImage () на public static getImage () и заменил anImg.getImage () на ImageFetcher.getImage (), изображение успешно отобразится !!!

Спасибо за ваши ответы на этот вопрос :) Я с нетерпением жду, когда вернусь после этого испытания!

FetchImageApp.java

...
...
public class FetchImageApp() 
extends MIDlet implements CommandListener {

     private ImageFetcher anImg; //this is my ImageFetcher instance, it is assigned within the constructor

     public FetchImageApp(){
         anImg = new ImageFetcher(); //NO IT WASN'T, I knew it was something simple... I feel a fool... but I know we all do it!
     }
...
     private doThis(){
        try {
            Image im;
            if ((im = anImg.getImage()) != null) {
                ImageItem ii = new ImageItem(null, im, ImageItem.LAYOUT_DEFAULT, null);
                // If there is already an image, set (replace) it
                if (form.size() != 0) {
                    form.set(0, ii);
                } else // Append the image to the empty form
                {
                    form.append(ii);
                }
            } else {
                form.append("Unsuccessful download.");
            }
            // Display the form with the image
            display.setCurrent(form);
        } catch (Exception e) {
            System.err.println("Msg: " + e.toString());
        }
     }
...
...
...

ImageFetcher.java

...
...
...
    /*--------------------------------------------------
     * Open connection and download png into a byte array.
     *-------------------------------------------------*/
    public Image getImage() throws IOException {
        String url = "http://kenai.com/attachments/wiki_images/chessgame/java-duke-logo.png";
        ContentConnection connection = (ContentConnection) Connector.open(url);

        // * There is a bug in MIDP 1.0.3 in which read() sometimes returns
        //   an invalid length. To work around this, I have changed the
        //   stream to DataInputStream and called readFully() instead of read()
//    InputStream iStrm = connection.openInputStream();
        DataInputStream iStrm = connection.openDataInputStream();

        ByteArrayOutputStream bStrm = null;
        Image im = null;

        try {
            // ContentConnection includes a length method
            byte imageData[];
            int length = (int) connection.getLength();
            if (length != -1) {
                imageData = new byte[length];

                // Read the png into an array
//        iStrm.read(imageData);
                iStrm.readFully(imageData);
            } else // Length not available...
            {
                bStrm = new ByteArrayOutputStream();

                int ch;
                while ((ch = iStrm.read()) != -1) {
                    bStrm.write(ch);
                }

                imageData = bStrm.toByteArray();
                bStrm.close();
            }

            // Create the image from the byte array
            im = Image.createImage(imageData, 0, imageData.length);
        } finally {
            // Clean up
            if (iStrm != null) {
                iStrm.close();
            }
            if (connection != null) {
                connection.close();
            }
            if (bStrm != null) {
                bStrm.close();
            }
        }
        return (im == null ? null : im);
    }
...
...
...

Вот код слушателя согласно запросу:)

public void commandAction(Command c, Displayable d) {
    if (c == doThisCommand) {
        if (c.getLabel().equals("Start")) {
            System.out.println("Started...");
            begin();
            //doThisCommand = new Command("Stop", Command.OK, 2); //ERROR:: After the command is changed to exit the program throws and unhandled excaption.
        } else {
            System.out.println("Stopped...");
            doThisCommand = new Command("Start", Command.OK, 2);
        }
    } else if (c == exitCommand) {
        notifyDestroyed();
    } else {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

Ответы [ 2 ]

1 голос
/ 19 марта 2010

Если вы получаете NullPointerException на anImg.getImage(), то это просто означает, что anImg равно null. Сделайте System.out.println(anImg);, вы увидите, что он печатает null.

Чтобы это исправить, нужно как-то создать экземпляр anImg. Э.Г.

ImageFetcher anImg = new ImageFetcher();

Только тогда вы сможете получить к нему доступ и вызывать методы для него.

1 голос
/ 19 марта 2010

Можете ли вы опубликовать свой слушатель? Я предполагаю, что NPE происходит от того факта, что слушатель использует экземпляр ImageFetcher, который является null. При разыменовании это NullPointerException бросается.

Этого не происходит, когда вы переходите на статический метод, поскольку здесь не задействован ни один экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...