2016-06-04 4 views
0

Я написал проблему с практикой для автоматеринга весны и получения NullPointerException.NullPointerException on spring autowiring

вот мой код
интерфейс: Форма

public interface Shape { 
    public void draw(); 
} 

Класс: Треугольник

public class Triangle implements Shape{ 

    private Point A; 
    private Point B; 
    private Point C; 

    public Point getA() { 
     return A; 
    } 

    public void setA(Point a) { 
     A = a; 
    } 

    public Point getB() { 
     return B; 
    } 

    public void setB(Point b) { 
     B = b; 
    } 

    public Point getC() { 
     return C; 
    } 

    public void setC(Point c) { 
     C = c; 
    } 

    public void draw(){ 
     System.out.println("PointA("+ A.getX() + "," + A.getY() +")"); 
     System.out.println("PointB("+ B.getX() + "," + B.getY() +")"); 
     System.out.println("PointC("+ C.getX() + "," + C.getY() +")"); 
    } 
} 

Класс: Очки

public class Point { 

    private int x,y; 

    public int getX() { 
     return x; 
    } 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getY() { 
     return y; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

} 

Spring XML

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <bean id="triangle" class="org.demo.javabrains.Triangle" autowire="byName"> 
    </bean> 

    <bean id="A" class="org.demo.javabrains.Point"> 
     <property name="x" value="0"/> 
     <property name="y" value="0"/> 
    </bean> 

    <bean id="B" class="org.demo.javabrains.Point"> 
     <property name="x" value="10"/> 
     <property name="y" value="20"/> 
    </bean> 

    <bean id="C" class="org.demo.javabrains.Point"> 
     <property name="x" value="30"/> 
     <property name="y" value="40"/> 
    </bean> 
</beans> 

Главный класс

public class DrawingApp { 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
     Shape triangle =(Shape) context.getBean("triangle"); 
     triangle.draw(); 

    } 

} 

Я не знаю, почему я получаю NullPointer исключение на этом , когда я пытаюсь запустить этот код он бросает исключение

INFO: Loading XML bean definitions from class path resource [spring.xml] 
Exception in thread "main" java.lang.NullPointerException 
    at org.demo.javabrains.Triangle.draw(Triangle.java:34) 
    at org.demo.javabrains.DrawingApp.main(DrawingApp.java:16) 

Точка A присваивается значением null не знаю, почему

+1

Это простая опечатка: она должна быть ' Tunaki

ответ

0

Ваш Метод треугольника .draw() использует объект класса Point. Вы объявили объект Point в xml, но не использовали его для ввода в определение треугольника. Вот почему он дает исключение из null-указателя, потому что он не инициализируется.

Вашего треугольник боб Защита в Spring XML должна быть как

<bean id="triangle" class="org.demo.javabrains.Triangle" autowire="byName"> 
<property name="A" ref="A"/> 
<property name="B" ref="B"/> 
<property name="B" ref="B"/> 
</bean> 
1

Когда вы используете автоматическое связывания по имени собственности:

<bean id="triangle" class="org.demo.javabrains.Triangle" autowire="byName" /> 

Spring ищет фасоль с тем же именем, свойство, которое необходимо автоувеличивать. Например, если для определения bean-компонента установлено значение autowire byName и оно содержит свойство с именем a, то есть оно имеет метод setA(..) (не путать с полем A), Spring ищет определение компонента по имени a и использует чтобы установить свойство.

Как @Tunaki правильно указал в комментариях, вы вводите в заблуждение имена свойств с именем самого поля, которое равно A. В любом случае, если вы используете имена в нижнем регистре для ваших Point бобов, вы бы хорошо:

<bean id="a" class="org.demo.javabrains.Point"> /* Same as before */ </bean> 

<bean id="b" class="org.demo.javabrains.Point"> /* Same as before */ </bean> 

<bean id="c" class="org.demo.javabrains.Point"> /* Same as before */ </bean> 

Для более детального обсуждения автоматического связывания сотрудников весной, проверка на documentation.

0

Попытайтесь не использовать верхний регистр имени компонента (первое слово), также не пытайтесь установить переменную объекта, начиная с Uppercase, это приведет к исключениям с нулевым указателем.

//These are the bean definitions 
<bean name="MyClassA" id="Aclass" class="com.test.autowire.MyClassA" autowire="byName"></bean> 
<bean name="bClass" id="bClass" class="com.test.autowire.MyClassB"></bean> 



public class MyClassA { 
private MyClassB bClass; 
//donot use BClass, use the first letter as lowercase eg: bClass 

public MyClassB getbClass() { 
    return bClass; 
} 

public void setbClass(MyClassB bClass) { 
    this.bClass = bClass; 
} 

public void printInA(){ 
    bClass.print(); 
    bClass.disp(); 
} 
} 

public class MyClassB { 
MyClassB(){ 
    System.out.println("THis is my Class B default Constrctr"); 
} 
void print(){ 
    System.out.println("This is a print"); 
} 
void disp(){ 
    System.out.println("This is disp methd"); 
} 
} 
Смежные вопросы