在练习期间,我得到一个简单的问题,即当我将null分配给对象并调用某个函数时会发生什么?所以我通过使用空指针异常处理main方法来尝试自己,它不起作用。无论如何在将null赋值给对象后调用方法。我想执行我的方法。
public class MyProgram {
public void test1()
{
System.out.println("say hello");
}
public void test2()
{
System.out.println("say hi");
}
public static void main(String[] args) throws NullPointerException{
// TODO Auto-generated method stub
MyProgram myPrg= new MyProgram();
myPrg = null;
myPrg.test1();
myPrg.test2();
}
}
如果不可能,请解释原因!!!
答案 0 :(得分:0)
您致电myPrg = null;
在null
引用上调用方法会产生NullPointerException
。
删除该行,它应该工作。
答案 1 :(得分:0)
我通常在调用方法之前检查null,如果变量有可能为null。所以:
if (myPrg != null) {
myPrg.test1();
myPrg.test2();
} else {
// do something else instead if needed
}
当我不需要做任何事情时,我通常使用第一种方法,或者如果对象为空则需要做一些完全不同的事情。
或者在调用测试方法之前将myPrg设置为非null(如果它为null):
if (myPrg == null) {
myPrg = new MyProgram();
}
myPrg.test1();
myPrg.test2();
我通常将第二种方法用于对象可能为null的情况,因为它尚未初始化,如果是这种情况,我想初始化它,然后像往常一样执行代码。 / p>
或者,您可以使用try / catch:
try {
myPrg.test1();
muPrg.test2();
} catch(NullPointerException e) {
// do something else instead
}
通常不会对NullPointerException执行try / catch。使用上述其他方法之一是更好的编程习惯。
顺便说一句,如果你做了这些事情,你可以取出throws NullPointerException
条款,因为它不会导致它再抛出异常。
请注意,您无法在null对象上调用方法。这部分是因为null对象不知道它是什么类型(因此它不知道它是MyProgram类型的空对象),并且因为通常类上的方法需要一些上下文从对象中,这就是为什么它们被写为类的方法。
如果您的方法不需要对象进行操作,请将它们设置为静态。
public static void test1() {
System.out.println("say hello");
}
可以在不需要MyProgram实例的情况下调用它来调用它。你可以拨打MyProgram.test1();
我认为这可能是您正在寻找的而不是处理NullPointerException的方法
答案 2 :(得分:0)
为了处理NullPointerException
,您必须在异常所在的地方添加try/catch
块(在这种情况下将会抛出)。
看看这段代码:
public class MyProgram {
public void test1()
{
System.out.println("say hello");
}
public void test2()
{
System.out.println("say hi");
}
public static void main(String[] args) {
MyProgram myPrg= new MyProgram();
myPrg = null;
// use a try/catch block to catch the NullPointerException
try {
myPrg.test1();
myPrg.test2();
} catch (NullPointerException) {
System.out.println("A NullPointerException was thrown!");
}
}
请注意我改变了两件事:
NullPointerException
- 不再需要它,因为它是在方法本身中处理的除了简单地捕获空引用之外,您还可以检查空引用,然后执行操作:
public class MyProgram {
public void test1()
{
System.out.println("say hello");
}
public void test2()
{
System.out.println("say hi");
}
public static void main(String[] args) {
MyProgram myPrg= new MyProgram();
myPrg = null;
// test if myPrg is null
if (myPrg != null) {
// proceed with tests
myPrg.test1();
myPrg.test2();
} else {
// print a message
System.out.println("myPrg is null!");
}
}
在这里,我们只测试第17行myPrg
是否为空,如果不为空,则继续测试 - 否则打印一条消息,说明myPrg
为空。
我希望这有帮助!
答案 3 :(得分:0)
您可以处理异常,但无法调用您的方法。该 原因是你的方法连接到一个对象,没有它 对象,你不可能知道你在谈论什么方法。即使是 name在你脑海中建立了一个连接,java没有这样的连接。
如果您根本不需要任何对象,只需要方法即可实现此目的 使用静态方法,没有任何变量。像
这样的东西class MyProgram {
public static void method() {}
public static void main() { MyProgram.method(); }
}
在这种情况下,您正在使用该课程来告诉您要调用的女士,而不是 一个对象。
对于你想做的事情,这可能是错误的设计,但我假设你 希望了解原因,而不是让某些事情发挥作用。
答案 4 :(得分:0)
NullPointerException是RuntimeException,因此try / catch对于它是可选的。 实际上它不是处理RunTimeExceptions的好习惯。 我想把它写成AS
if (myPrg != null) {
myPrg.test1();
myPrg.test2();
}
了解有关JAVA中的例外情况的更多信息 http://johnpwood.net/2008/04/21/java-checked-exceptions-vs-runtime-exceptions/