Относительно монстра "Null Pointer" - PullRequest
2 голосов
/ 02 ноября 2010

Рискуя звучать как начинающий программист, я задаю слишком повсеместный вопрос о монстре "Null Pointer".Вот фрагмент кода:

public class pixel
{
    private String type = "empty";

    private void Type(String t){type = t;}
    private String Type(){if(type!=null)return type; else return "empty";}
}

Поймите это: ни в одном месте моего кода я не передаю null в Type.Почему тип не возвращает значение?(Как примечание, я вызываю этот метод в своем расширении paintComponent. Чтобы исключить возможность использования нулевого массива (в котором хранятся пиксельные объекты), я сделал соответствующую проверку)

Ответы [ 6 ]

3 голосов
/ 02 ноября 2010

Я согласен, что Type() никогда не вернет ноль.Он не вернет "empty", если Type(String) никогда не вызывался или не был принят последний вызов null.

Как примечание, дизайн вашего класса сбивает с толку (например, два метода с одинаковыми именами, но с разными целями, без конструктора).

1 голос
/ 04 ноября 2010

Если вы знаете, что никогда не передаете null для типа, используйте этот шаблон:

public final class Pixel {

  private String type;

  private Pixel(String type) {
    setType(type);
  }

  private void setType(String type) {
    type.getClass();
    this.type = type;
  }

  private String getType() {
    return type;
  }
}

Перед каждым присваиванием полю type код проверяет, что присвоенное значение не равно нулю. Это в сочетании с методами получения и установки гарантирует, что этот инвариант останется верным. Если, конечно, это не внутренний класс, и вы изменяете его из прилагаемого кода.

1 голос
/ 02 ноября 2010

Прежде всего, скажите это явно, то есть setType(String t) и getType(). Теперь проверьте null в вашем сеттере.

public class pixel {

    private String type = "empty";

    private void setType(String t){if (t!=null) type = t;}
    private String getType(){return type;}
}

Aha! Я только что заметил, что ваш метод private. Вы серьезно относитесь к этому? Ваша переменная type никогда не изменится, грубо говоря. Мой предложенный код, без каких-либо знаний о вашем приложении,

public class pixel {

    private String type = "";

    public void setType(String t){
        if (t != null) 
            type = t;
    }

    public String getType(){
        return type;
    }
}
0 голосов
/ 02 ноября 2010

Может быть, я здесь упускаю суть, но разве это не очевидно (не относится к java), давайте разберем код:

public class pixel
{
    private String type = "empty"; //type string with a value of "empty" is available everywhere in the class --- (1)

    private void Type(String t)
    {
        type = t;
    }
    private String Type()
    {
        if(type!=null) //How can type is null or anything else, you have defined it in (1)
        {
            return type; 
        }

        else
        { 
            return "empty"; //Type RETURNS "empty" as a value.
        }
    }

    public static void main(String[] args)
    {
        pixel obj = new pixel();
        System.out.println(obj.Type()); //You call Type() here
    }
}

Если вы используете глобальную переменную где-либо в области видимости класса, если она будет вам доступна.

0 голосов
/ 02 ноября 2010

В этом случае type никогда не будет нулевым, но это очень простой случай. И, между прочим, если в некоторых случаях он становится нулевым, вы должны вернуть пустую строку "" или просто нулевую, в зависимости от вашего дизайна. "empty" может быть допустимо в этом случае, но не используйте подобные вещи для реального.

0 голосов
/ 02 ноября 2010

Следуйте логике.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...