Ответ 1
NullPointerException
- исключение времени выполнения, которое не рекомендуется перехватывать, но вместо этого избегайте:
if(someVariable != null) someVariable.doSomething();
else
{
// do something else
}
Я попытался использовать блок 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;
}
}
NullPointerException
- исключение времени выполнения, которое не рекомендуется перехватывать, но вместо этого избегайте:
if(someVariable != null) someVariable.doSomething();
else
{
// do something else
}
Как уже было сказано в другом ответе, не рекомендуется улавливать исключение 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.
Проблема с вашим кодом находится в вашем цикле в Check_Circular. Вы продвигаетесь через список, используя n1, перейдя по одному узлу за раз. Переставляя n2 в n2.next.next, вы продвигаетесь через него по два за раз.
Когда вы это сделаете, n2.next.next может быть пустым, поэтому n2 будет иметь значение null после назначения. Когда цикл повторяется и он проверяет, не является ли n2.next нулевым, он выбрасывает NPE, потому что он не может перейти к следующему, поскольку n2 уже имеет значение null.
Вы хотите сделать что-то вроде того, что Алекс написал вместо этого.
Я думаю, что ваша проблема находится внутри CheckCircular, в то время как условие:
Предположим, что у вас есть 2 узла, первые N1 и N2 указывают на один и тот же узел, затем N1 указывает на второй узел (последний), а N2 указывает на нуль (поскольку это N2.next.next). В следующем цикле вы пытаетесь вызвать "следующий" метод на N2, но N2 имеет значение NULL. Там у вас это, NullPointerException
Вы должны поймать 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;
}