2013-02-20 4 views
0

Я новичок в Java и я пытаюсь написать Linked-List Stack ..Что не так с моим java-кодом?

public class Stack { 

    private Node first; 

    private class Node { 
     int item; 
     Node next; 
    } 

    public boolean IsEmpty() 
    { 
     return first==null; 
    } 

    public void push(int item) 
    { 
     Node oldfirst=first; 
     first=new Node(); 
     first.item=item; 
     first.next=oldfirst; 
    } 

    public int pop() 
    { 
     int item=first.item; 
     first=first.next; 
     return item; 
    } 
} 

import javax.swing.*; 

public class main { 

    public static void main(String[] args) { 
     Stack ob=null; 
     int num=0; 
     while (true) 
     { 
      num=Integer.parseInt(JOptionPane.showInputDialog("Enter the number")); 
      ob.push(num); 
      if (num==0) 
       break; 
     } 
     int k; 
     k=ob.pop(); 
     JOptionPane.showMessageDialog(null, k);  
    } 

теперь, когда я ввожу номер компилятор через Execption java.lang.NullPointerException в main.main (main.java:18)

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

ответ

4

Ваш стек ob является нулевым, когда вы звоните толчок. Вам нужно создать экземпляр. Вместо

Stack ob=null; 

вам нужно иметь

Stack ob = new Stack(); 
+0

Wow !! я не знал, что если у вас нет подрядчика, вы можете его инициализировать так! – Coderji

+0

@OsamaEspil Если вы не определяете конструктор, Java это делает для вас. См. Это [ответ] (http://stackoverflow.com/a/4488766/264775) для более подробной информации. – thegrinner

4

Ваш код:

Stack ob=null 
... 
ob.push(num); 

ob является null, вы никогда не присвоить объект к нему. Вызов метода на null всегда приведет к NullPointerException.

Вы можете исправить это следующим образом:

Stack ob = new Stack(); 
0

Большинство исключений имеют автономный пояснительная имя. Это, например, это исключение NullPointerException - есть нулевой объект, к которому обращаются, и вызывается исключение.

Вы пытаетесь определить «ob» как новый объект Stack, хотя вы просто определили его как null. Между определением и вызовом метода (ob.push()) ob не изменяется снова и, следовательно, остается null, вызывая исключение.

Чтобы исправить это, вам необходимо убедиться, что объект не имеет значения null при его вызове. Есть два способа исправить ошибку.

Во-первых, вы можете создать экземпляр объекта. Это заставило бы программу работать так, как вам хочется. Для этого просто определите объект следующим образом: Stack ob = new Stack();, а не Stack ob = null;.

Второй способ исправить это - поймать ошибку. Это сделает так, чтобы программа продолжалась, если произошла ошибка. Я рекомендую использовать это, когда есть потенциал, что объект может быть нулевым, чтобы программа не просто закрывалась. Для этого обведите линию с помощью пункта try-catch:

try 
{ 
    ob.push(num); 
} 
catch (NullPointerException e) 
{ 
    System.out.println("Error at: ob.push(num);"); 
} 
+0

Спасибо, что было полезно ^^ – Coderji

+0

@OsamaEspil Добро пожаловать - лучше избегать ошибок, но ловить их не удается сбой программы. –

+1

В общем, вы не должны ловить NPE; они обычно указывают на ошибку программирования, как это было в случае с Усамой. – GriffeyDog

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