Domanda

Ho trovato un codice sorgente e ho aggiunto al mio telaio solo per il test che utilizza Java2D. Ma thows un'eccezione. Non capisco perché.

la mia classe:

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;
}}

eccezione:

  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)
È stato utile?

Soluzione

La linea incriminata è qui img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg")); Assicurarsi che il file esista riferimento a questo documento per vedere l'ordine di come le risorse vengono caricate Doc per getResource

Altri suggerimenti

java.lang.NullPointerException
    at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:97)

Faccio un ipotesi: l'URL è nullo. È necessario eseguire il debug delle variabili che sono stati utilizzati nel periodo in cui il proprio il codice appare per la prima volta nella stacktrace. Ho già spiegato in uno dei tuoi argomenti precedenti come eseguire il debug .

Usa il debugger e definire un punto di interruzione in modo che l'applicazione si arresta quando la NPE viene generata. Poi si trova la riga di codice in cui si ha un riferimento null che causa problemi. (O impostare il punto di interruzione sulla riga di codice che viene stampato sul stack trace)

E 'quasi impossibile dare un aiuto più dettagliate senza vedere la parte del codice che genera l'eccezione.

Modifica

semplice errore di battitura questa volta? È il file immagine chiamato Yahoo-Messanger.jpg o non dovrebbe essere Yahoo-Messenger.jpg invece? Potrebbe essere che non è possibile trovare l'immagine. Purtroppo il tuo frammento stacktrace non include la riga di codice nella classe in cui iniziano i problemi.

Trovo il modo migliore per risolvere questi problemi è un passo alla volta. L'eccezione afferma che c'è stato un errore durante il recupero dell'immagine. In SignInFrame() si sta cercando di recuperare un img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg")); immagine

Assicurarsi che si punta per l'immagine correttamente. Esso può anche aiutare a guardare il Javadoc per getResource .

Inoltre, penso (e im nessun esperto) che è generalmente una buona idea mettere metodi che possono gettare eccezione in un try-catch. In questo modo si sa esattamente dove l'errore si verifica quando l'eccezione è un tiro.

Credo che quando si chiama f.start () sarà effettivamente richiamare il metodo run () e non il metodo di propria start (), dal momento che la classe implementa Runnable.

la domanda è già una risposta, ma mi avrebbe suggerito due ulteriori modifiche in questa linea:

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

1 - controllare l'URL restituito, sarà null se non è stata trovata l'immagine.

2 - Penso che Image.class è fuorviante qui. Utilizzare getClass() in quanto non v'è alcuna (apparente) ragione per usare il programma di caricamento classi della classe Immagine.

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

un'eccezione sarebbe la migliore IMHO soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top