2013-12-12 4 views
0

я уже спросил один из противоречия вопроса здесь Why is this not throwing a NullPointerException?Почему это исключение исключения null-указателя?

Но это один из различного типа и поведения я хочу знать, пожалуйста, посмотрите на мой пример ниже

package com; 

public class test { 

    public static void main(String[] args) { 
     Abc abc = null; 

     //Scenario 1 
     System.out.println("ERROR HERE " + abc!=null?abc.getS1():""); //This is throwing null pointer exception 

     //Scenario 2 
     String s1 = abc!=null?abc.getS1():""; 
     System.out.println("This is fine " + s1); 
    } 
} 

class Abc { 
    String s1; 

    public String getS1() { 
     return s1; 
    } 

    public void setS1(String s1) { 
     this.s1 = s1; 
    } 


} 

Так вот сценария 2 будет работать нормально, но почему он не работает, когда я пытаюсь использовать его с другим конкатенацией строк в Сценарий 1?

+0

Из-за порядка оценки аргумента 'println()' в 1-м случае '' ОШИБКА ЗДЕСЬ '+ abc' сначала оценивается и дает NPE. –

ответ

2

Вам нужно будет отделить его (со скобками), так что он прочитал в целом отдельное заявление

System.out.println("ERROR HERE " + (abc != null ? abc.getS1() : "")); 
+0

работает для меня, вы все еще получаете ту же ошибку? –

5
"ERROR HERE " + abc!=null?abc.getS1():"" 

эквивалентно

("ERROR HERE " + abc!=null)?abc.getS1():"" 

(который никогда не оценивает ложь и поэтому вы получаете NPE)

Вы имели в виду:

"ERROR HERE " + (abc!=null?abc.getS1():"") 
+3

Правила приоритета операторов приведены здесь: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html – Tenner

+1

Оператор «+» выше в списке, чем тернарный условный оператор '?:'. – Tenner

0

+1 голос за Эяля и Росса.

После просмотра как этот ответ и комментарий по Теннер, я пришел к выводу, что,

он бросает nullPointerException потому ! = приоритет оператора меньше +.

Так компилятор звонит toString метод Abc класса и, следовательно, аЬс является нулевой он бросает nullPointerException.

Пожалуйста, исправьте меня, если я ошибаюсь.

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