سؤال

لقد وجدت شفرة المصدر وأضفتها إلى الإطار الخاص بي فقط للاختبار الذي يستخدمه 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;
}}

الاستثناء:

 INITING: DECS-JAR: تجميع ملف مصدر واحد إلى C:  Users  ICC  المستندات  NetBeansProjects  Yahooserver  Build  Complet  Compile-Single: Run-Single: Encuction Error Fetching Image: java.lang.nullpointerexception في Sun.awt. image.urlimagesource.getConnection (Urlimagesource.java:97) في Sun.awt.image.urlimagesource.getDecoder (Urlimagesource.java:107) في Sun.awt.image.Inputstreamimagesource.DoFetch (Inputstreamimagesource.java: 2440) في Sun.Awt .image.imagefetcher.fetchloop (ImageFetcher.java:172) في sun.awt.image.imagefetcher.run (imagefetcher.java:136)
هل كانت مفيدة؟

المحلول

الخط المخالف هناimg = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));تأكد من أن الملف موجود يشير إلى هذا الوثيقة لرؤية الترتيب الخاص بكيفية تحميل المواردjava doc for getresource

نصائح أخرى

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

أنا أفعل تخمين برية: عنوان URL فارغ. تحتاج إلى تصحيح المتغيرات التي تم استخدامها في الوقت المحدد بنفسك يظهر الرمز لأول مرة في StackTrace. لقد قمت بالفعل شرح

استخدم مصححك وتحديد نقطة توقف حتى يتوقف تطبيقك عند إلقاء NPE. ثم ستجد سطر التعليمات البرمجية حيث يكون لديك مرجع فارغ يسبب مشكلة. (أو تعيين نقطة توقف على سطر التعليمات البرمجية المطبوعة على تتبع المكدس)

من المستحيل تقريبا إعطاء مساعدة أكثر تفصيلا دون رؤية جزء من التعليمات البرمجية التي يلقي الاستثناء.

تعديل

مطبعي بسيط هذه المرة؟ هل يسمى ملف الصورة Yahoo-Messanger.jpg أو لا ينبغي أن يكون Yahoo-Messenger.jpg في حين أن؟ يمكن أن يكون ذلك لا يمكنك العثور على الصورة. لسوء الحظ، لا يتضمن StackTrace Snippet خط التعليمات البرمجية في صفك حيث تبدأ المشكلة.

أجد أفضل طريقة لحل هذه المشاكل هي خطوة واحدة في وقت واحد. ينص الاستثناء على وجود خطأ في جلب الصورة. في SignInFrame() تحاول استرداد صورة img = getToolkit().getImage(Image.class.getResource("Yahoo-Messanger.jpg"));

تأكد من أنك تشير إلى الصورة بشكل صحيح. قد يساعد أيضا في النظر إلى جافادوك ل GetResource..

أيضا، أعتقد (وأنا لا خبير) أنه من الجيد عموما وضع الأساليب التي قد ترمي استثناءا في محاولة التقاط. بهذه الطريقة تعرف بالضبط حيث يحدث الخطأ عندما يكون الاستثناء رمي.

أعتقد أنه عند استدعاء F.Start ()، سيتحذر في الواقع طريقة التشغيل () وليس طريقة البداية الخاصة بك ()، لأن الفئة تنفذ Runnable.

أجاب السؤال بالفعل، لكني اقترح تغييرتين إضافيتين في هذا الخط:

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

1 - تحقق من عنوان URL الذي تم إرجاعه، سيكون null إذا لم يتم العثور على الصورة.

2 - أعتقد ذلك Image.class هو مضللة هنا. يستخدم getClass() نظرا لعدم وجود سبب (واضح) لاستخدام Classlader لفئة الصورة.

    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