线程异常 java.lang.NullPointerException
Exception in thread java.lang.NullPointerException
当我 运行 这个线程我得到这个结果,我不知道为什么
第一个线程是 运行ning
正在加载栏页面
Exception in thread "Thread-0" java.lang.NullPointerException at
com.sctrcd.multidsdemo.integration.threads.FirstThread.run(FirstThread.java:29)
和代码,
package com.sctrcd.multidsdemo.integration.threads;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.sctrcd.multidsdemo.domain.bar.Bar;
import com.sctrcd.multidsdemo.integration.config.AppConfig;
import com.sctrcd.multidsdemo.integration.repositories.bar.BarPagingAndSortingRepository;
import com.sctrcd.multidsdemo.integration.repositories.bar.BarRepository;
@ContextConfiguration(classes =AppConfig.class,
loader=AnnotationConfigContextLoader.class)
public class FirstThread extends Thread {
@Autowired
BarPagingAndSortingRepository barPage;
public void run() {
System.out.println("FirstThread is running");
System.out.println("Loading bar page");
Page<Bar> bars=barPage.findAll(new PageRequest(0, 1, Direction.DESC, "id"));
System.out.println("Bar page loaded");
Bar bar=bars.getContent().get(0);
System.out.println("Creating bar");
System.out.println(bar.getId());
System.out.println();
//int a = 20;
Thread.currentThread().interrupt();
System.out.println("Interrupt");
}
public static void main(String args[]) {
FirstThread thread=new FirstThread();
thread.start();
}
}
运行 您的程序处于调试模式,并评估第 29 行中的每个方法调用和变量。所以你会看到其中哪些是空的
由于此代码是从 public static void main 开始的 - 没有初始化任何注入上下文,@Autowired 注释将不起作用,因此 barPage 为 null。
在 JUnit 测试中它可以工作,如果在 Junit 测试中有特殊的注释,它初始化了 Spring 上下文。
看看这里:http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html
并且始终考虑一个规则。 Bean 只能在另一个 bean 中注入(自动装配)。您的测试用例不是 bean
这是 pagingAndSorting bean
package com.sctrcd.multidsdemo.integration.repositories.bar;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.sctrcd.multidsdemo.domain.bar.Bar;
public interface BarPagingAndSortingRepository extends PagingAndSortingRepository<Bar, Integer> {
}
您的 Main 方法应该看起来像这样才能成功绑定到 Spring 上下文:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
BarPagingAndSortingRepository barPage = (BarPagingAndSortingRepository) context.getBean("barPage");
}
}
当我 运行 这个线程我得到这个结果,我不知道为什么
第一个线程是 运行ning
正在加载栏页面
Exception in thread "Thread-0" java.lang.NullPointerException at com.sctrcd.multidsdemo.integration.threads.FirstThread.run(FirstThread.java:29)
和代码,
package com.sctrcd.multidsdemo.integration.threads;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import com.sctrcd.multidsdemo.domain.bar.Bar;
import com.sctrcd.multidsdemo.integration.config.AppConfig;
import com.sctrcd.multidsdemo.integration.repositories.bar.BarPagingAndSortingRepository;
import com.sctrcd.multidsdemo.integration.repositories.bar.BarRepository;
@ContextConfiguration(classes =AppConfig.class,
loader=AnnotationConfigContextLoader.class)
public class FirstThread extends Thread {
@Autowired
BarPagingAndSortingRepository barPage;
public void run() {
System.out.println("FirstThread is running");
System.out.println("Loading bar page");
Page<Bar> bars=barPage.findAll(new PageRequest(0, 1, Direction.DESC, "id"));
System.out.println("Bar page loaded");
Bar bar=bars.getContent().get(0);
System.out.println("Creating bar");
System.out.println(bar.getId());
System.out.println();
//int a = 20;
Thread.currentThread().interrupt();
System.out.println("Interrupt");
}
public static void main(String args[]) {
FirstThread thread=new FirstThread();
thread.start();
}
}
运行 您的程序处于调试模式,并评估第 29 行中的每个方法调用和变量。所以你会看到其中哪些是空的
由于此代码是从 public static void main 开始的 - 没有初始化任何注入上下文,@Autowired 注释将不起作用,因此 barPage 为 null。
在 JUnit 测试中它可以工作,如果在 Junit 测试中有特殊的注释,它初始化了 Spring 上下文。
看看这里:http://www.springbyexample.org/examples/intro-to-ioc-creating-a-spring-application.html
并且始终考虑一个规则。 Bean 只能在另一个 bean 中注入(自动装配)。您的测试用例不是 bean
这是 pagingAndSorting bean
package com.sctrcd.multidsdemo.integration.repositories.bar;
import org.springframework.data.repository.PagingAndSortingRepository;
import com.sctrcd.multidsdemo.domain.bar.Bar;
public interface BarPagingAndSortingRepository extends PagingAndSortingRepository<Bar, Integer> {
}
您的 Main 方法应该看起来像这样才能成功绑定到 Spring 上下文:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
BarPagingAndSortingRepository barPage = (BarPagingAndSortingRepository) context.getBean("barPage");
}
}