2016-05-10 2 views
1

Мне нужно принять несколько действий в зависимости от условия if. Скажем, у меня есть перечисление «VoucherType»Как избежать NullPointerException в случае, если условие

Теперь у меня есть код, который выполняется в зависимости от состояния: -

private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 

    if(event.getVoucherType().equals(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP)){ 
     someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 

Я должен выполнить SomeAction(), если событие типа «GIVE_AWAY_MONEY_ON_SIGNUP» , Но мне не нужно ничего делать, это тип события, кроме «GIVE_AWAY_MONEY_ON_SIGNUP». Поэтому, когда я вызываю этот код, я устанавливаю для voucherType значение «GIVE_AWAY_MONEY_ON_SIGNUP» и выполняется некоторая функция «Action()».

Но для любых других типов событий я получаю исключения из нулевого указателя в условии if, поскольку я никогда не устанавливал тип ваучера, поскольку я не хочу делать ничего особенного. Поэтому, чтобы избежать исключения nullPointerException, я установил код ваучера на что-то фиктивное (другие значения ваучераType), которое я никогда не использую в каких-либо условиях. Я там сложный способ, я могу исключить nullPointerException без инициализации VoucherType в случае?

+1

если (перечисление && enum.Football)? –

+0

Это не сработает. Первая часть условия по-прежнему будет генерировать исключение nullPointerException, поскольку оно будет оценивать значение null. – pune06

+0

Почему так много пустых голосов. Я новичок в сообществе. Пожалуйста, помогите мне упомянуть о комментариях, причине downvotes. – pune06

ответ

1

Как определено Викиучебнике:

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

Если вы не создаете экземпляр значения перечисления, оно будет иметь значение null. Таким образом, программа пытается ссылаться на объект, который содержит null, который выдает NullPointerException.

Таким образом, нет, нет способа избежать вашего NullPointerException. Перед попыткой ссылаться на них необходимо создать переменные.

6

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

if(enum != null && enum.Football) { 
    //some action 
} 
+0

Спасибо @Asma - Да, точка очень хорошо взята. Но я ищу другой ответ. Есть ли альтернативный способ. Но шансы на это выглядят мрачно :) – pune06

+2

@ pune06 Вы можете объяснить, почему вы не хотите использовать это решение? Также вы могли бы объяснить свои причины, о которых вы спрашивали, поэтому у других будет возможность прочитать о них до публикации аналогичного решения? – Pshemo

+0

Если enum - это ваш объект (кстати, вы должны избегать присвоения имен переменных, которые могут быть ключевыми словами), нет другого способа избежать NPE, чем тестировать его. Более подробная информация о вашем коде и вашей проблеме будет полезна для вас. – Asma

1

Я бы проверял, нет ли перечисления, кроме того, чтобы проверить значение enum.Football.

void method(){ 
     if(enum!=null && enum.Football){ 
      SomeAction(); 
     } 
    } 
3

Если event никогда не null, в этом случае, возможно, вы можете инвертировать тест:

private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 
    if(VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){ 
      someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 

в противном случае вы должны проверить, если event не null перед:

private boolean verifyGiveAwayAccounting(GiveAwayMoneyVerificationEvent event) { 
    if(event != null && VoucherType.GIVE_AWAY_MONEY_ON_SIGNUP.equals(event.getVoucherType())){ 
      someAction(); 
    } 
    return verifySystemAccountTransaction(event); 
} 
+1

Поскольку мы фактически сравниваем перечисления, мы могли бы просто сравнивать ссылки с == и не использовать равные вообще. Это позволит устранить дальнейшие возможности НСЕ. –

+0

@ 911DidBush, конечно, это возможность, но некоторые люди предпочитают метод равных по разным причинам. В исходном коде используется метод equals, и я его сохранил. – dams

1

Помимо уже упомянутые ответы на проверку нулевого значения, другой возможностью было бы фактически создать дополнительную оценку перечисления е что представляет нуль («фиктивное значение») и использовать его в качестве значения по умолчанию:

public enum VoucherType { 
    UNDEFINED, 
    GIVE_AWAY_MONEY_ON_SIGNUP, 
    //.... 
    ; 
} 

Define «неопределенный» в качестве значения по умолчанию:

public class Event { 
    private VoucherType voucherType = VoucherType.UNDEFINED; 

    public Event() { 
    } 

    public VoucherType getVoucherType() { 
     return this.voucherType; 
    } 

    public void setVoucherType(VoucherType voucherType) { 
     if(voucherType==null) { 
      throw new IllegalArgumentException(); // make sure that voucher type cannot be set to null 
     } 
     this.voucherType=voucherType; 
    } 
} 

Таким образом, событие, никогда не будет иметь нуля, как voucherType и вместо этого значение перечисления НЕ УКАЗАНО.

Предупреждение: Многие люди предпочли бы ПОЛУЧАТЬ в NullPointerException вместо вышеуказанного раствора, чтобы немедленно получить обратную связь, когда они забывают установить voucherType. С приведенным выше решением возникает ошибка забывания, чтобы установить voucherType и не осознавать его (потому что код не вызывает ошибки) намного проще.

Кроме того, это может заставить вас проверить, не является ли ваучерType НЕ УКАЗАННЫМ для некоторых операций, где требование состоит в том, что оно установлено в значащее значение.

Я бы предпочел проверить нуль сам, но так как вы сказали, что хотите другие решения, я думал, что я все это публикую.

+1

Значение по умолчанию - интересное предложение, но, на мой взгляд, 'throw new IllegalArgumentException();' более уместно в настройщике – dams

+0

Спасибо @ 911DidBush за ваши усилия. Да, в настоящее время я использую DummyValue в своем перечислении, t нравится :) – pune06

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