提问者:小点点

为什么即使调用了异常,我也没有收到任何错误消息? [已关闭]


我有以下3款类,请看一下:

main.java:

package com.tsc.sendit.worker;

public class Main {

    public static void main(String[] args) {
        new Thread(new Loader()).start();
    }
}

加载器。java

package com.tsc.sendit.worker;

import java.io.File;

public class Loader implements Runnable,Divider.OnExceptionChangeListener {

    private Divider divider;

    public Loader(){
        divider = Divider.getInstance();
        // register listener
        divider.setOnExceptionChangeListener(this);
    }

    @Override
    public void run() {
        // a random fileName (it doesn't exist)
        divider.setFile(new File("f:\\licenses.txt"));
    }

    @Override
    public void onExceptionChanged(String errorMsg) {
        System.out.println(errorMsg);
    }
}

Divider.java

package com.tsc.sendit.worker;

import java.io.File;
import java.io.FileNotFoundException;

public class Divider {

    private static Divider divider;

    private String errorMsg;
    private OnExceptionChangeListener onExceptionChangeListener;

    private Divider() {}

    public static Divider getInstance() {
        if(divider==null)
            divider = new Divider();
        return divider;
    }

    public void setOnExceptionChangeListener(OnExceptionChangeListener onExceptionChangeListener) {
        this.onExceptionChangeListener = onExceptionChangeListener;
        if(errorMsg!=null) {
            notifyListener();
        }
    }

    private void notifyListener() {
        onExceptionChangeListener.onExceptionChanged(errorMsg);
    }

    public void setFile(File file) {
        startDividing();
    }

    private void startDividing() {
        try {
            throw new FileNotFoundException();
        } catch (FileNotFoundException e) {
            errorMsg = "abc";
        }
    }

    interface OnExceptionChangeListener {
        void onExceptionChanged(String errorMsg);
    }
}

我甚至调试了这段代码,这使我得出结论,虽然errorMsg发生了变化,但自定义侦听器无法工作。 我遵循了这里提到的方法:How-to-create-custom-listeners-in-

(尽管那里的代码可以工作)

请给我提供一个解决方案。 提前谢谢你。


共1个答案

匿名用户

“事件侦听器”这个名字并没有什么魔力。 当你设置错误的时候,你需要真的炒掉它们。没有办法告诉Java:你能让它自动工作吗?

因此,在errorMsg=“abc”行后面,您可能需要NotifyListener();,并且您的NotifyListener实现需要一个空保护:

if (onExceptionChangeListener != null) onExceptionChangeListener.onExceptionChanged(errorMsg);

或者更好的做法是创建一个方法updateErrorMsg(String msg),它既更新errorMsg,又通知侦听器如果它不为空。