2013-02-28 3 views
13

Я попытался использовать блок try-catch, чтобы поймать NullPointerException, но при этом следующая программа дает ошибки. Я делаю что-то неправильно или есть другой способ поймать NullPointerException в следующей программе. Любая помощь высоко ценится.Поймать nullpointerexception в Java

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; 
    } 

} 
+2

«дает ошибки» ... неужели вы можете быть более конкретным? – meriton

+0

Непонятно, как вы используете класс LinkedListNode. Например, класс, подобный этому, - org.jivesoftware.util.LinkedListNode. – user1929959

+0

просто предложение кодирования. попытайтесь выполнить соглашение при назначении класса и методов. – Ankit

ответ

26

NullPointerException является исключение времени выполнения, не рекомендуется, чтобы поймать его, но вместо того, чтобы избежать этого:

if(someValriable != null) someValriable.doSomething(); 
else 
{ 
    // do something else 
} 
+3

тем более, что все дело в том, что он не находит что-то, что вы хотите найти, поэтому, даже если вы его поймаете, оно может распространяться на другие части программы. –

1

Вы должны ловить NullPointerException с кодом выше, но это не меняет тот факт, что ваш Check_Circular ошибочен. Если вы исправите Check_Circular, ваш код не будет бросать NullPointerException в первую очередь и работать по назначению.

Try:

public static boolean Check_Circular(LinkedListNode head) 
{ 
    LinkedListNode curNode = head; 
    do 
    { 
     curNode = curNode.next; 
     if(curNode == head) 
      return true; 
    } 
    while(curNode != null); 

    return false; 
} 
+1

Вы НЕ должны ловить NPE. – elToro

2

Я думаю, ваша проблема находится внутри CheckCircular, в состоянии в то время:

Предположим у вас есть 2 узла, первый N1 и N2 указывают на тот же узел, затем N1 указывает на второй узел (последний) и N2 указывает на нуль (поскольку это N2.next.next). В следующем цикле вы пытаетесь вызвать «следующий» метод на N2, но N2 имеет значение NULL. Там у вас это есть, NullPointerException

3

Проблема с вашим кодом находится в вашей петле в Check_Circular. Вы продвигаетесь через список, используя n1, перейдя по одному узлу за раз. Переставляя n2 в n2.next.next, вы продвигаетесь через него по два за раз.

Когда вы это сделаете, n2.next.next может быть пустым, поэтому n2 будет иметь значение null после назначения. Когда цикл повторяется и он проверяет, не является ли n2.next нулевым, он выбрасывает NPE, потому что он не может перейти к следующему, поскольку n2 уже имеет значение null.

Вы хотите сделать что-то вроде того, что Алекс написал вместо этого.

11

Как уже говорилось, в другом ответе не рекомендуется поймать 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.

Смежные вопросы