java中句柄NullPointerException的问题?

时间:2014-04-10 19:13:07

标签: java exception-handling nullpointerexception

在练习期间,我得到一个简单的问题,即当我将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();
    }

}

如果不可能,请解释原因!!!

5 个答案:

答案 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!");
     }
}

请注意我改变了两件事:

  1. 我从主方法中删除了引发NullPointerException - 不再需要它,因为它是在方法本身中处理的
  2. 我在第18-23行添加了一个try / catch块来捕获异常(如果它被抛出)(
  3. 除了简单地捕获空引用之外,您还可以检查空引用,然后执行操作:

    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/