0 0

求!哪位大大帮忙看看为什么是空指针异常?5

两个接口InterfaceA, InterfaceB:

public interface InterfaceA {
      
void methodA();
}




public interface InterfaceB {
     
void methodB();
}

两个类A,B分别实现此两个接口:

public class A implements InterfaceA {
     
public void methodA() {
System.out.println("A implements InterfaceA");}
}



public class B implements InterfaceB {
     
public void methodB() {System.out.println("B implements InterfaceB");}
}

父类Super中,两个接口作为实例变量

public class Super {

public InterfaceA a;
public InterfaceB b;

public void useMethodA()  {

try{
a.methodA();
} catch (Exception ex){
System.out.println(ex.getMessage());
}

}

public void useMethodB(){
try{
b.methodB();
} catch (Exception ex){
System.out.println(ex.getMessage());
}
}
}



子类Son继承父类,(问题来乐!这时候public InterfaceA a = new A();可以成立的?new一个A的对象 然后直接可以赋给类型为InterfaceA的对象?)

public class Son extends Super {
      public InterfaceA a = new A();
      public InterfaceB b = new B();
}

写一个TestDrive, 编译成功,并正常调用了实现了接口的方法!

public class TestDrive {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
       Son s = new Son();
       s.useMethodA();
       s.useMethodB();
}

}

控制台输出:

null
null


问题补充:
meng22623 写道
public class Son extends Super {
      public InterfaceA a = new A();
      public InterfaceB b = new B();
}
这里你声明的a和b与父类的a和b根本没有关系。子类的a和b是自己特有的,你根本没有引父类的a和b。
就像feige1008这位兄台说的,
public class Son extends Super {
      a = new A();
      b = new B();
}
改成这样就可以了。


明白了!这里重新声明了一次~ 这样子类的useMethod方法就无法找到相关的实例变量,而成为空指针。

问题补充:
AngelAndAngel 写道
呵呵,我明白lz的意思了,我copy了一下你的代码,看了一下,我一开始也迷惑了。因为我开始觉得不应该是null,而是打印出那几个语句。我最初是这么想的:
Son既然是继承Super,并且也有两个
      InterfaceA a
     InterfaceB b
那么应该来说是继承并重写了父类的属性,也就是说a,b都应该是初始化了的,所以在调用的时候应该不会为null。

其实不是这样的,Son继承了Super,所以继承了Super的属性和方法,而这个时候呢,方法并没有重写,还是沿用了父类Super的,那么父类方法里面所有的元素都保持父类自己的特色,根本不会下放到子类,而父类的a,b都没有实例化,所以出现了null。


原因找到了,子类我重新声明了一次变量,因此方法useMethodA和useMethodB用到的a和b并没有初始化,因此用useMethod的时候,无法读取a和b的变量。

如果我不声明a,b 
直接用 a = new A(); b = new B();

就可以了,而不用重写那两个方法,因为方法已经从父类继承下来了,只要有相关的变量就可以了。

问题补充:
AngelAndAngel 写道
lz,其实你明白的 只是一个浅显的表象。按道理说,子类的属性跟父类的肯定有关系的(怎么会没关系呢),只是说在这里你子类方法没有重写,所以看不出有关系,而这个误区才刚刚解释了你的现象而已。
你仔细看一下我的回答。


我明白你的意思,但我的目的是想方法在父类就已经写好了,子类不用再重写。

因此我是希望将父类声明的a,b在子类实例化,然后在父类进行运算。但问题就出在,我子类的两个实例变量重新声明了,因此useMethod里用到的变量a,b并没有进行初始化。^^
OO 
2011年8月30日 01:34

6个答案 按时间排序 按投票排序

0 0

采纳的答案

public class Son extends Super {
      public InterfaceA a = new A();
      public InterfaceB b = new B();
}
这里你声明的a和b与父类的a和b根本没有关系。子类的a和b是自己特有的,你根本没有引父类的a和b。
就像feige1008这位兄台说的,
public class Son extends Super {
      a = new A();
      b = new B();
}
改成这样就可以了。

2011年8月30日 10:25
0 0

lz,其实你明白的 只是一个浅显的表象。按道理说,子类的属性跟父类的肯定有关系的(怎么会没关系呢),只是说在这里你子类方法没有重写,所以看不出有关系,而这个误区才刚刚解释了你的现象而已。
你仔细看一下我的回答。

2011年8月30日 12:50
0 0

public class Son extends Super {
      public InterfaceA a = new A();
      public InterfaceB b = new B();
}

此类变成
public class Son extends Super {
      a = new A();
      b = new B();
}
就好了。

2011年8月30日 09:34
0 0

呵呵,我明白lz的意思了,我copy了一下你的代码,看了一下,我一开始也迷惑了。因为我开始觉得不应该是null,而是打印出那几个语句。我最初是这么想的:
Son既然是继承Super,并且也有两个
      InterfaceA a
     InterfaceB b
那么应该来说是继承并重写了父类的属性,也就是说a,b都应该是初始化了的,所以在调用的时候应该不会为null。

其实不是这样的,Son继承了Super,所以继承了Super的属性和方法,而这个时候呢,方法并没有重写,还是沿用了父类Super的,那么父类方法里面所有的元素都保持父类自己的特色,根本不会下放到子类,而父类的a,b都没有实例化,所以出现了null。

2011年8月30日 09:20
0 0

InterfaceA a   InterfaceB b 你申明了两次,初始化了子类的,父类中的却是没有初始化的。

2011年8月30日 09:19
0 0

引用
问题来乐!这时候public InterfaceA a = new A();可以成立的?new一个A的对象 然后直接可以赋给类型为InterfaceA的对象?


只要A实现了实现了InterfaceA 接口就可以这么赋值,自动上转型,就好比
Object str = new String();或List list = new ArrayList()一个样

引用
控制台输出:

null
null


不会输出null的吧

public class Son extends Super {
      public InterfaceA a = new A();
      public InterfaceB b = new B();
}

Super类声明了两个字段a和b,并初始化为默认值null,子类Son又声明了两个字段a和b
Super类中useMethodA和useMethodB使用的还是Super类声明的a和b,因为没有初始化,会NullPointerException

如果要在子类初始化父类声明的对象,这样就可以了:
public class Son extends Super {
      a = new A();
      b = new B();
}

2011年8月30日 07:44

相关推荐

    sqoop.zip解决报空指针的问题所需要的jar

    4. **测试运行**:尝试运行引起空指针异常的Sqoop命令,看是否成功解决了问题。如果仍有问题,可能需要检查日志并进行更深入的故障排查。 5. **监控日志**:分析Sqoop的日志文件,查找具体的错误信息,这有助于定位...

    作业--类的空指针操作成员函数1

    在静态成员函数的情况下,它们不属于特定的对象实例,而是属于类本身,因此可以直接通过类名或者类的非NULL指针调用,即使指针是空的。例如,`Counter::Getnum()`在这种情况下是允许的,因为它不依赖于任何特定的...

    J2EE编程(action之空指针处理)

    在struts.xml配置文件中,我们可以定义全局的异常映射,当发生空指针异常时,自动跳转到一个错误页面。这样可以提供更友好的用户体验,同时简化代码: ```xml <result name="error">/error.jsp ``` ...

    xiaozhengyu#StudyNotes#拆装箱_自动拆装箱与空指针异常1

    自动拆装箱与NPE有代码:编译,反编译:现在的IDE还是比较智能的:所以还是多看看IDE给出的提示吧,当然了,最重要的还是自己先了解什么样的代码可能产生怎样的错

    Android中利用NetworkInfo判断网络状态时出现空指针(NullPointerException)问题的解决方法

    总的来说,当在Android应用中判断网络状态时,为了避免空指针异常,我们需要确保正确地处理可能为null的对象,特别是在涉及IPC操作时。同时,理解Android的系统服务和数据同步机制对于写出更健壮的代码至关重要。...

    你必须知道的495个C语言问题

    为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...

    鼠标指针下载,可以看看

    在描述中提到的"可用于微软xp\win7",表明这些鼠标指针是兼容这两个较早版本的Windows操作系统的。在Windows XP和Windows 7中,用户可以通过以下步骤更改鼠标指针: 1. 打开控制面板:点击“开始”按钮,然后选择...

    《你必须知道的495个C语言问题》

    为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...

    山寨版的千千静听~~帮忙看看行不??

    自己写的哦!!!!呵呵还有待改进 大家可以看看 就剩下一个单曲循环了,谁会,可以共享一下呀!吼吼~~~

    Java异常处理教程

    1. 不要忽视异常:即使异常看起来不严重,也应该正确处理,避免程序意外终止。 2. 适当的异常类型:选择与错误条件最匹配的异常类型,使代码更具可读性和可维护性。 3. 提供有意义的异常消息:异常消息应清晰地描述...

    C语言FAQ 常见问题列表

    为什么这些问题如此经常地出现? o 6.12 我很困惑。我就是不能理解这些空指针一类的东西。 o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用...

    【独家高薪笔面试题库】与【实战配套练习演练】9.Exception异常1

    而`RuntimeException`是一类特殊的异常,它包括所有由Java虚拟机或Java类库抛出的非检查异常,如空指针异常、数组越界异常等。 `throws`关键字用于声明一个方法可能抛出的异常,这表明调用这个方法的代码需要处理...

    导图_指针与引用

    指针是C++中的一个变量,它存储的是内存地址,即另一个变量的位置。通过指针,我们可以间接地访问和修改该地址所对应的值。例如,声明一个整型变量`int a = 10;`,然后声明一个指向`a`的指针`int *ptr = &a;`,`ptr`...

    关于指针的理解---从空间看

    在C语言中,指针是程序设计中的一个重要概念,它提供了对内存地址的直接操作,使得我们可以高效地访问和修改内存中的数据。本篇将从空间的角度深入理解指针。 首先,我们需要了解指针的基本概念。指针是一个变量,...

    C++指针初学者必看

    指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。 让...

    自定义指针样式为图片.zip

    本文将深入探讨如何使用CSS(Cascading Style Sheets)来实现这一目标,特别是如何将指针样式自定义为透明的图标图片。我们将以"自定义指针样式为图片"为例,通过一个实际的案例来展示具体步骤。 首先,我们需要...

    C与指针高清版

    根据提供的标题“C与指针高清版”及描述“C与指针,很经典,值得一看,不多说,看看就知道!”可以推断出这是一份关于C语言中指针使用的资料或书籍。虽然部分内容并未给出具体章节或示例代码,但我们可以基于C语言中...

    15款经典动态鼠标指针

    动态鼠标指针是一种个性化的计算机桌面元素,它们增强了用户的交互体验,通过动态效果使鼠标光标更加生动有趣。本文将详细介绍这些动态鼠标指针的特点、使用方法以及它们可能带来的计算机性能影响。 首先,我们来看...

Global site tag (gtag.js) - Google Analytics