Почему этот код генерирует исключение java.lang.NullPointerException? - PullRequest
3 голосов
/ 07 января 2010

Я нашел исходный код и добавил его в свой фрейм только для тестирования, которое использует Java2D. Но это исключение. Я не понимаю почему.

мой класс:

package ClientGUI;




import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.RenderingHints;
import java.awt.geom.CubicCurve2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;

/**
 *
 * @author ICC
 */

public class SignInFrame extends javax.swing.JFrame implements Runnable {

private static int iw,  ih,  iw2,  ih2;
private static Image img;
private static final int FORWARD = 0;
private static final int BACK = 1;

// the points of the curve
private Point2D pts[];

// initializes direction of movement forward, or left-to-right
private int direction = FORWARD;
private int pNum;
private int x,  y;
private Thread thread;
private BufferedImage bimg;

/** Creates new form SignInFrame */
public SignInFrame() {
    initComponents();
    img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));
    try {
        MediaTracker tracker = new MediaTracker(this);
        tracker.addImage(img, 0);
        tracker.waitForID(0);
    } catch (Exception e) {
    }
    iw = img.getWidth(this);
    ih = img.getHeight(this);
    iw2 = iw / 2;
    ih2 = ih / 2;

}

public void reset(int w, int h) {
    pNum = 0;
    direction = FORWARD;

    // initializes the cubic curve
    CubicCurve2D cc = new CubicCurve2D.Float(
            w * .2f, h * .5f, w * .4f, 0, w * .6f, h, w * .8f, h * .5f);

    // creates an iterator to define the boundary of the flattened curve
    PathIterator pi = cc.getPathIterator(null, 0.1);
    Point2D tmp[] = new Point2D[200];
    int i = 0;

    // while pi is iterating the curve, adds points to tmp array
    while (!pi.isDone()) {
        float[] coords = new float[6];
        switch (pi.currentSegment(coords)) {
            case PathIterator.SEG_MOVETO:
            case PathIterator.SEG_LINETO:
                tmp[i] = new Point2D.Float(coords[0], coords[1]);
        }
        i++;
        pi.next();
    }
    pts = new Point2D[i];

    // copies points from tmp to pts
    System.arraycopy(tmp, 0, pts, 0, i);
}

public void step(int w, int h) {
    if (pts == null) {
        return;
    }
    x = (int) pts[pNum].getX();
    y = (int) pts[pNum].getY();
    if (direction == FORWARD) {
        if (++pNum == pts.length) {
            direction = BACK;
        }
    }
    if (direction == BACK) {
        if (--pNum == 0) {
            direction = FORWARD;
        }
    }
}

public void drawDemo(int w, int h, Graphics2D g2) {
    g2.drawImage(img,
            0, 0, x, y,
            0, 0, iw2, ih2,
            this);
    g2.drawImage(img,
            x, 0, w, y,
            iw2, 0, iw, ih2,
            this);
    g2.drawImage(img,
            0, y, x, h,
            0, ih2, iw2, ih,
            this);
    g2.drawImage(img,
            x, y, w, h,
            iw2, ih2, iw, ih,
            this);
}

public Graphics2D createGraphics2D(int w, int h) {
    Graphics2D g2 = null;
    if (bimg == null || bimg.getWidth() != w || bimg.getHeight() != h) {
        bimg = (BufferedImage) createImage(w, h);
        reset(w, h);
    }
    g2 = bimg.createGraphics();
    g2.setBackground(getBackground());
    g2.clearRect(0, 0, w, h);
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setRenderingHint(RenderingHints.KEY_RENDERING,
            RenderingHints.VALUE_RENDER_QUALITY);
    return g2;
}

@Override
public void paint(Graphics g) {
    Dimension d = getSize();
    step(d.width, d.height);
    Graphics2D g2 = createGraphics2D(d.width, d.height);
    drawDemo(d.width, d.height, g2);
    g2.dispose();
    g.drawImage(bimg, 0, 0, this);
}

public void start() {
    thread = new Thread(this);
    thread.setPriority(Thread.MIN_PRIORITY);
    thread.start();
}

public synchronized void stop() {
    thread = null;
}

public static void main(String argv[]) {

    SignInFrame f = new SignInFrame();





    f.start();
}

public void run() {

    Thread me = Thread.currentThread();
    while (thread == me) {
        repaint();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            break;
        }
    }
    thread = null;
}}

исключение:

  init:
  deps-jar:
  Compiling 1 source file to C:\Users\ICC\Documents\NetBeansProjects\YahooServer\build\classes
  compile-single:
  run-single:
  Uncaught error fetching image:
  java.lang.NullPointerException
          at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)
          at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:107)
          at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
          at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
          at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)

Ответы [ 6 ]

4 голосов
/ 07 января 2010

Оскорбительная строка здесь img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg")); Убедитесь, что файл существует, обратитесь к этому документу, чтобы увидеть порядок загрузки ресурсов. Java Doc для getResource

2 голосов
/ 07 января 2010
java.lang.NullPointerException
    at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)

Я делаю дикое предположение: URL-адрес является нулевым. Вам необходимо отладить переменные, которые использовались примерно в то время, когда ваш собственный код впервые появляется в трассировке стека. Я уже объяснил в одной из ваших предыдущих тем, как отлаживать.

1 голос
/ 07 января 2010

Я считаю, что лучший способ решить эти проблемы - это шаг за шагом. Исключение гласит, что при получении изображения произошла ошибка. В SignInFrame() вы пытаетесь получить изображение img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));

Убедитесь, что вы правильно указываете на изображение. Также может помочь поиск javadoc для getResource .

Кроме того, я думаю (и я не эксперт), что, как правило, рекомендуется помещать методы, которые могут вызывать исключения, в try-catch. Таким образом, вы точно знаете, где происходит ошибка, когда выбрасывается исключение.

1 голос
/ 07 января 2010

Используйте ваш отладчик и определите точку останова, чтобы ваше приложение останавливалось, когда выбрасывался NPE. Затем вы найдете строку кода, где у вас есть нулевая ссылка, которая вызывает проблемы. (или установите точку останова на строке кода, напечатанной на трассировке стека)

Почти невозможно дать более подробную помощь, не увидев ту часть кода, которая вызывает исключение.

Редактировать

Простая опечатка на этот раз? Файл изображения называется Yahoo-Messanger.jpg или вместо него должен быть Yahoo-Messenger.jpg? Может быть, вы не можете найти изображение. К сожалению, в вашем фрагменте stacktrace нет строки кода в вашем классе, где начинаются проблемы.

0 голосов
/ 07 января 2010

на вопрос уже дан ответ, но я бы предложил два дополнительных изменения в этой строке:

    img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));

1 - проверьте возвращенный URL, это будет null, если изображение не было найдено.

2 - я думаю, что Image.class вводит в заблуждение здесь. Используйте getClass(), поскольку нет (явной) причины использовать Classloader класса Image.

    URL url = getClass().getResource("Yahoo-Messanger.jpg");
    if (url == null) {
        // some error handling here: throw an Exception, logging, ...
    }
    img = getToolkit().getImage(url);

бросить Исключение было бы лучшим решением ИМХО.

0 голосов
/ 07 января 2010

Я думаю, что когда вы вызываете f.start (), он на самом деле вызывает метод run (), а не ваш собственный метод start (), поскольку класс реализует Runnable.

...