我尝试使用try-catch块来捕获NullPointerException
,但仍然是以下程序出错。我做错了什么或者在下面的程序中有没有其他方法可以捕获NullPointerException
。任何帮助都非常感谢。
public class Circular_or_not
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
try
{
LinkedListNode[] nodes = new LinkedListNode[10];
for (int i = 0; i < 10; i++)
{
nodes[i] = new LinkedListNode(i, null, i > 0 ? nodes[i - 1] : null);
}
// Create loop;
// nodes[9].next = nodes[3];
Boolean abc= Check_Circular(nodes[0]);
System.out.print(abc);
}
catch(NullPointerException e)
{
System.out.print("NullPointerException caught");
}
}
public static boolean Check_Circular(LinkedListNode head)
{
LinkedListNode n1 = head;
LinkedListNode n2 = head;
// Find meeting point
while (n2.next != null)
{
n1 = n1.next;
n2 = n2.next.next;
if (n1 == n2)
{
return true;
}
}
return false;
}
}
答案 0 :(得分:36)
NullPointerException
是一个运行时异常,建议不要捕获它,而是避免它:
if(someValriable != null) someValriable.doSomething();
else
{
// do something else
}
答案 1 :(得分:16)
如前所述,另一个答案是不建议捕获NullPointerException。但是你肯定能抓住它,就像下面的例子所示。
public class Testclass{
public static void main(String[] args) {
try {
doSomething();
} catch (NullPointerException e) {
System.out.print("Caught the NullPointerException");
}
}
public static void doSomething() {
String nullString = null;
nullString.endsWith("test");
}
}
虽然可以捕获NPE,但你绝对不应该这样做,而是修复最初的问题,即Check_Circular方法。
答案 2 :(得分:3)
您的代码存在于Check_Circular的循环中。您通过一次运行一个节点使用n1推进列表。通过将n2重新分配给n2.next.next,您可以一次推进两个。
当你这样做时,n2.next.next可能为null,因此在赋值后n2将为null。当循环重复并检查n2.next是否为空时,它会抛出NPE,因为它无法到达下一个,因为n2已经为空。
你想要像Alex发布的那样做。
答案 3 :(得分:2)
我认为你的问题在CheckCircular中,在while条件下:
假设您有2个节点,第一个N1和N2指向同一个节点,然后N1指向第二个节点(最后一个),N2指向空(因为它是N2.next.next)。在下一个循环中,您尝试在N2上调用'next'方法,但N2为null。你有它,NullPointerException
答案 4 :(得分:1)
您应该使用上面的代码捕获NullPointerException
,但这不会改变您的Check_Circular
错误的事实。如果您修复Check_Circular
,您的代码将不会首先抛出NullPointerException
,并按预期工作。
尝试:
public static boolean Check_Circular(LinkedListNode head)
{
LinkedListNode curNode = head;
do
{
curNode = curNode.next;
if(curNode == head)
return true;
}
while(curNode != null);
return false;
}