문제

소스 코드를 찾았고 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)
도움이 되었습니까?

해결책

불쾌한 선이 여기에 있습니다img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));파일이 존재하는지 확인 하여이 문서를 참조하여 리소스로드되는 방법에 대한 순서를 확인하십시오.GetResource를위한 Java Doc

다른 팁

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

나는 거친 추측을한다 : URL은 null이다. 시간에 사용 된 변수를 디버깅해야합니다. 너 스스로 스택 트레이스에서 코드가 처음으로 나타납니다. 나는 벌써 설명했다 이전 주제 중 하나에서 디버그하는 방법.

Debugger를 사용하고 중단 점을 정의하여 NPE가 발생하면 응용 프로그램이 중지되도록하십시오. 그런 다음 문제를 일으키는 널리 참조가있는 코드 줄을 찾을 수 있습니다. (또는 스택 추적에 인쇄 된 코드 라인에서 중단 점을 설정)

예외를 던지는 코드의 일부를 보지 않고 더 자세한 도움을주는 것은 거의 불가능합니다.

편집하다

이번에는 간단한 오타? 이미지 파일이 호출됩니다 Yahoo-Messanger.jpg 아니면 그렇지 않아야합니다 Yahoo-Messenger.jpg 대신에? 이미지를 찾을 수 없을 수도 있습니다. 불행히도 StackTrace 스 니펫에는 문제가 시작되는 클래스에 코드 줄이 포함되어 있지 않습니다.

이러한 문제를 해결하는 가장 좋은 방법은 한 번에 한 단계 씩이라는 것입니다. 예외는 이미지를 가져 오는 오류가 있음을 나타냅니다. ~ 안에 SignInFrame() 이미지를 검색하려고합니다 img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));

이미지를 올바르게 가리키고 있는지 확인하십시오. 또한 보는 데 도움이 될 수 있습니다 GetResource를위한 Javadoc.

또한, 나는 (그리고 전문가가 아닌), 일반적으로 시험을 치르는 방법을 제외 할 수있는 방법을 넣는 것이 좋은 생각이라고 생각합니다. 이렇게하면 예외가 발생하면 오류가 어디에서 발생하는지 정확히 알 수 있습니다.

클래스가 runnable을 구현하기 때문에 f.start ()를 호출 할 때는 자신의 start () 메소드가 아니라 실제로 run () 메소드를 호출한다고 생각합니다.

질문은 이미 답변되었지만이 라인에서 두 가지 추가 변경 사항을 제안했습니다.

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

1- 반환 된 URL을 점검하면 null 이미지를 찾을 수없는 경우.

2- 나는 그렇게 생각합니다 Image.class 여기서 오도하고 있습니다. 사용 getClass() 이미지 클래스의 클래스 로더를 사용해야 할 이유가 없습니다.

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

예외를 던지는 것은 최고의 솔루션 IMHO입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top