2013-12-02 3 views
2

У меня есть два метода, которые оба печатают содержимое на массивах, один объявляется как public void, а другой static void. Однако, когда я вызываю эти методы из основного класса программы, они отличаются друг от друга.java objects - public vs static behavior

общественного недействительными:

public void listStudent() { 
    for (int i = 0;i < 10;i++) { 
     if (studentNamesArray[i] != null) { 
     System.out.println(studentNamesArray[i]); 
     for(int y = 0;y < 3;y++) { 
      System.out.println(studentMarksArray[i][y]); 
     } 
     } 
    } 
    } 

Статическая пустота:

static void printArrays() { 
    for (int i = 0;i < 10;i++) { 
     if (studentNamesArray[i] != null) { 
     System.out.println(studentNamesArray[i]); 
     for(int y = 0;y < 3;y++) { 
      System.out.println(studentMarksArray[i][y]); 
     } 
     } 
    } 
    } 

public void при вызове приводит к ошибке nullPointerEception в то время как static void вызов ничего не печатает (как ожидается). В обоих случаях массивы пустые, но если я сохраняю значение и затем удаляю это значение, то метод public void затем печатает ничего, как ожидалось. то есть public void приводит к ошибке, если она вызывается до создания объекта, даже если этот объект сразу же удаляется из массива.

Почему эти методы ведут себя по-разному? Является ли плохая практика объявлением метода static void?

+5

Как вы называете 'public void'? Показать код вызова метода. – Masudul

+1

Почему 'i <10'? Использовать 'i Maroun

+0

public и static - это две совершенно разные вещи. –

ответ

2

Проверьте, как вы вызываете метод. Для общедоступного метода, который не является статическим, объект должен быть инициализирован.

Возьмем, к примеру, класс, как это:

public class CustomObject 
{ 
    private static String[][] studentNamesArray = null; 

    public void listStudents() {...} 
    public static void printArrays() {...} 
} 

Если вы должны были сделать этот призыв:

CustomObject.printArrays(); 

вызов не будет работать (и печать ничего), так как этот метод static и поэтому всегда существует при ссылке на этот CustomObject.

Если вы должны были сделать этот призыв:

CustomObject co; 
co.listStudents(); 

он потерпит неудачу с нулевым указателем исключения, поскольку CustomObject «со» не был инициализирован. Невозможно вызвать вызовы методов для нулевого объекта.

Кроме того, массив должен быть инициализирован. Трудно сказать, что происходит в вашей программе без окружающего кода, но вызов:

if(studentNamesArray[i] == null) 

будет производить NPE, если массив не инициализирован. Невозможно найти [i] -ый экземпляр нулевого массива. Это верно для статических и локальных версий метода.