Java 将对象传递给实现runnable的类的目的
有三节课 调用打印消息的基本类 调用方实现Runnable,并从主类Synch获取对象 同步为CallMe创建对象的主类,并将其传递给类调用方类,然后启动线程。 问题: 在Synch类中,将对象传递给类调用方需要什么?当我尝试在没有CallMe对象的情况下调用类调用者时,编译器抛出一个NullPointerException。你能提供这种行为的任何原因吗 例如:调用方ob1=新调用方Hello;//调用时没有CallMe类的对象 以下是工作代码供参考Java 将对象传递给实现runnable的类的目的,java,multithreading,runnable,Java,Multithreading,Runnable,有三节课 调用打印消息的基本类 调用方实现Runnable,并从主类Synch获取对象 同步为CallMe创建对象的主类,并将其传递给类调用方类,然后启动线程。 问题: 在Synch类中,将对象传递给类调用方需要什么?当我尝试在没有CallMe对象的情况下调用类调用者时,编译器抛出一个NullPointerException。你能提供这种行为的任何原因吗 例如:调用方ob1=新调用方Hello;//调用时没有CallMe类的对象 以下是工作代码供参考 public 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");
}
}
}
调用者ob1=新调用者Hello
首先,这将是一个编译时错误,因为您没有只接受字符串作为参数的调用方构造函数
当我在没有CallMe对象的情况下调用类调用者时,编译器抛出null指针异常
我假设您打算按如下方式创建调用方:
Caller ob1 = new Caller(null, "Hello");
如果是这样,NPE将由您的run方法抛出,该方法将由调用方构造函数中的thread.start调用自动调用。调用者的任务似乎是在单独的线程中运行CallMe函数,因此传递给它的CallMe对象必须是非null值。NPE的原因是您的案例中缺少有效的CallMe对象
HTH.由于行的原因,编译器抛出NullPointerException
target.call(msg)
如果将null传递给调用方构造函数,那么实例变量target将设置为null,并且您正在对null引用调用一个方法,因此是NullPointerException
至于为什么您需要一个“Caller”和一个“CallMe”类,这只是风格的问题。其思想是为代码可能包含的任何业务逻辑创建一个可运行的“包装器类”。这样,线程就不会绑定到项目的核心中。调用方内部的CallMe对象目标未初始化,因此在调用构造函数Callertarget XXX进行初始化之前,该对象具有空值。当调用的对象的值为null时,总是会出现null指针异常
如果您使用CallerXXX而不传入CallMe对象,则调用方对象内的目标将不会被初始化