1

有3个班。

  1. CallMe打印消息的基本类
  2. Caller实现Runnable并从主类获取对象Synch
  3. Synch为类创建对象CallMe并将其传递给Caller类并启动线程的主类。

问题:在Synch类中,需要将对象传递给类Caller吗?当我尝试在没有编译器Caller对象的情况下调用类时会抛出. 您能否提供这种行为的任何原因。CallMeNullPointerException

例如:Caller ob1 = new Caller("Hello"); // calling without an object of class "CallMe"

以下是供参考的工作代码。

public class CallMe {
    void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
        System.out.println("]");
    }
}

class Caller implements Runnable {
    String msg;
    CallMe target;
    Thread t;

    public Caller(CallMe targ, String s) {
        target = targ;
        msg = s;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        target.call(msg);
    }
}

class Synch {
    public static void main(String args[]) {
        CallMe target = new CallMe();
        Caller ob1 = new Caller(target, "Hello");
        Caller ob2 = new Caller(target, "Synchronized");
        Caller ob3 = new Caller(target, "World");
        // wait for threads to end
        try {
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e) {
            System.out.println("Interrupted");
        }
    }
}
4

3 回答 3

0

来电者 ob1 = new Caller("Hello");

首先,这将是一个编译时错误,因为您没有Caller仅将字符串作为参数的构造函数。

当我厌倦了对没有“CallMe”对象的类“Caller”的调用时,编译器会抛出空指针异常

我假设您打算按如下方式创建调用者:

Caller ob1 = new Caller(null, "Hello"); 

如果是这样,NPE 由您的 run 方法抛出,该方法由您在构造函数中的thread.start()调用自动调用。Caller似乎工作是用于在单独的线程Caller中运行该函数,因此传递给它的对象必须是非空值。NPE 的原因是您的案例中没有有效的对象。CallMeCallMeCallMe

HTH。

于 2012-12-01T04:37:04.390 回答
0

由于该行,编译器会抛出 NullPointerException

target.call(msg)

如果将 null 传递给 Caller 构造函数,则实例变量 target 将设置为 null,并且您正在调用 null 引用上的方法,因此会出现 NullPointerException。

至于为什么需要同时拥有“Caller”和“CallMe”类,这只是风格问题。这个想法是为您的代码可能包含的任何业务逻辑创建一个可运行的“包装器类”。这样线程就不会绑定到项目的核心。

于 2012-12-01T04:38:55.853 回答
0

Caller 中的 CallMe 对象target未初始化,因此在null您调用构造函数 Caller(target, "XXX") 对其进行初始化之前具有值。null pointer exception当您调用的对象具有 value 时,您总是会得到null

如果您使用 Caller("XXX") 而不传入 CallMe 对象,target则 Caller 对象内部绝不会被初始化。

于 2012-12-01T04:46:07.293 回答