-
求!哪位大大帮忙看看为什么是空指针异常?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()`在这种情况下是允许的,因为它不依赖于任何特定的...
在struts.xml配置文件中,我们可以定义全局的异常映射,当发生空指针异常时,自动跳转到一个错误页面。这样可以提供更友好的用户体验,同时简化代码: ```xml <result name="error">/error.jsp ``` ...
自动拆装箱与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 说真的...
自己写的哦!!!!呵呵还有待改进 大家可以看看 就剩下一个单曲循环了,谁会,可以共享一下呀!吼吼~~~
1. 不要忽视异常:即使异常看起来不严重,也应该正确处理,避免程序意外终止。 2. 适当的异常类型:选择与错误条件最匹配的异常类型,使代码更具可读性和可维护性。 3. 提供有意义的异常消息:异常消息应清晰地描述...
为什么这些问题如此经常地出现? o 6.12 我很困惑。我就是不能理解这些空指针一类的东西。 o 6.13 考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必须为 0 不是更简单吗? o 6.14 说真的, 真有机器用...
而`RuntimeException`是一类特殊的异常,它包括所有由Java虚拟机或Java类库抛出的非检查异常,如空指针异常、数组越界异常等。 `throws`关键字用于声明一个方法可能抛出的异常,这表明调用这个方法的代码需要处理...
指针是C++中的一个变量,它存储的是内存地址,即另一个变量的位置。通过指针,我们可以间接地访问和修改该地址所对应的值。例如,声明一个整型变量`int a = 10;`,然后声明一个指向`a`的指针`int *ptr = &a;`,`ptr`...
在C语言中,指针是程序设计中的一个重要概念,它提供了对内存地址的直接操作,使得我们可以高效地访问和修改内存中的数据。本篇将从空间的角度深入理解指针。 首先,我们需要了解指针的基本概念。指针是一个变量,...
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。 让...
本文将深入探讨如何使用CSS(Cascading Style Sheets)来实现这一目标,特别是如何将指针样式自定义为透明的图标图片。我们将以"自定义指针样式为图片"为例,通过一个实际的案例来展示具体步骤。 首先,我们需要...
根据提供的标题“C与指针高清版”及描述“C与指针,很经典,值得一看,不多说,看看就知道!”可以推断出这是一份关于C语言中指针使用的资料或书籍。虽然部分内容并未给出具体章节或示例代码,但我们可以基于C语言中...
动态鼠标指针是一种个性化的计算机桌面元素,它们增强了用户的交互体验,通过动态效果使鼠标光标更加生动有趣。本文将详细介绍这些动态鼠标指针的特点、使用方法以及它们可能带来的计算机性能影响。 首先,我们来看...