-
求!哪位大大帮忙看看为什么是空指针异常?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并没有进行初始化。^^
2011年8月30日 01:34
6个答案 按时间排序 按投票排序
-
采纳的答案
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
-
lz,其实你明白的 只是一个浅显的表象。按道理说,子类的属性跟父类的肯定有关系的(怎么会没关系呢),只是说在这里你子类方法没有重写,所以看不出有关系,而这个误区才刚刚解释了你的现象而已。
你仔细看一下我的回答。2011年8月30日 12:50
-
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
-
呵呵,我明白lz的意思了,我copy了一下你的代码,看了一下,我一开始也迷惑了。因为我开始觉得不应该是null,而是打印出那几个语句。我最初是这么想的:
Son既然是继承Super,并且也有两个
InterfaceA a
InterfaceB b
那么应该来说是继承并重写了父类的属性,也就是说a,b都应该是初始化了的,所以在调用的时候应该不会为null。
其实不是这样的,Son继承了Super,所以继承了Super的属性和方法,而这个时候呢,方法并没有重写,还是沿用了父类Super的,那么父类方法里面所有的元素都保持父类自己的特色,根本不会下放到子类,而父类的a,b都没有实例化,所以出现了null。2011年8月30日 09:20
-
引用问题来乐!这时候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
相关推荐
4. **测试运行**:尝试运行引起空指针异常的Sqoop命令,看是否成功解决了问题。如果仍有问题,可能需要检查日志并进行更深入的故障排查。 5. **监控日志**:分析Sqoop的日志文件,查找具体的错误信息,这有助于定位...
在静态成员函数的情况下,它们不属于特定的对象实例,而是属于类本身,因此可以直接通过类名或者类的非NULL指针调用,即使指针是空的。例如,`Counter::Getnum()`在这种情况下是允许的,因为它不依赖于任何特定的...
自动拆装箱与NPE有代码:编译,反编译:现在的IDE还是比较智能的:所以还是多看看IDE给出的提示吧,当然了,最重要的还是自己先了解什么样的代码可能产生怎样的错
总的来说,当在Android应用中判断网络状态时,为了避免空指针异常,我们需要确保正确地处理可能为null的对象,特别是在涉及IPC操作时。同时,理解Android的系统服务和数据同步机制对于写出更健壮的代码至关重要。...
为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有...
在描述中提到的"可用于微软xp\win7",表明这些鼠标指针是兼容这两个较早版本的Windows操作系统的。在Windows XP和Windows 7中,用户可以通过以下步骤更改鼠标指针: 1. 打开控制面板:点击“开始”按钮,然后选择...
为什么这些问题如此频繁地出现? 60 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 60 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 60 5.17 说真的...
自己写的哦!!!!呵呵还有待改进 大家可以看看 就剩下一个单曲循环了,谁会,可以共享一下呀!吼吼~~~
在C#编程中,异常处理是一项至关重要的技能,它能够帮助开发者优雅地处理程序运行时可能出现的错误,保证程序的健壮性和稳定性。本篇将深入探讨“异常格式”,“抛出异常”以及“自定义异常”这三大知识点。 首先,...
为什么这些问题如此经常地出现? o 6.12 我很困惑。我就是不能理解这些空指针一类的东西。 o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用...
指针是C++中的一个变量,它存储的是内存地址,即另一个变量的位置。通过指针,我们可以间接地访问和修改该地址所对应的值。例如,声明一个整型变量`int a = 10;`,然后声明一个指向`a`的指针`int *ptr = &a;`,`ptr`...
在C语言中,指针是程序设计中的一个重要概念,它提供了对内存地址的直接操作,使得我们可以高效地访问和修改内存中的数据。本篇将从空间的角度深入理解指针。 首先,我们需要了解指针的基本概念。指针是一个变量,...
只要在VS2010源码编辑器中输入一个字符,它就报道错误了 "visual studio 2010 遇到了异常,可能是由某个扩展导致的......"。刚开始一看,以为是扩展引起的,那我就把vs中所有的扩展暂时禁用一下,结果bug还是依旧。...
本文将深入探讨如何使用CSS(Cascading Style Sheets)来实现这一目标,特别是如何将指针样式自定义为透明的图标图片。我们将以"自定义指针样式为图片"为例,通过一个实际的案例来展示具体步骤。 首先,我们需要...
根据提供的标题“C与指针高清版”及描述“C与指针,很经典,值得一看,不多说,看看就知道!”可以推断出这是一份关于C语言中指针使用的资料或书籍。虽然部分内容并未给出具体章节或示例代码,但我们可以基于C语言中...
让我们先看看没有加密的相册里面都有些什么照片! 再看看网址中有这样一个结尾:albumid=57e8c8a5-1738-43e0-96e4-71e28890cb4d albumid=665942244 albumid英文意思是相册的意思,后面的:665942244 我猜就是该相册...
还在为看不懂繁琐的C++指针而烦恼吗?这里有包含了指针变量、指针数组、多级指针、指针变换等经典问题的讲解,谁看谁知道!
二进制指针是由一位状态位和若干位二进制编码的地址位组成的。但是,如果在不同的时钟域内直接同步二进制指针,有可能产生问题。例如,当读指针从0111向1000变化的时侯,指针所有的位都要变化,如果写时钟恰好在读...
本项目名为“2013 超高仿迅雷看看播放器”,它是一款在2013年发布的、高度模仿迅雷官方播放器功能和界面的应用程序。这款播放器旨在为用户提供与迅雷看看相似的观影体验,但并非由迅雷公司官方开发。开发者可能通过...