2015-08-24 3 views
1
public class Learner { 
    public static void main(String[] args) { 
     String[] dataArr = new String[4]; 
     dataArr[1] = "Bill"; 
     dataArr[2] = "Steve"; 
     dataArr[3] = "Larry"; 
     try{ 
      for(String data : dataArr){ 
       System.out.print(data+" "); 
      } 
     }catch(Exception e){ 
      System.out.println(e.getClass()); 
     } 
    } 
} 

В книге говорится это напечатает: нулевой Билл Стив ЛарриNull или бросить исключение

Это меня смущает, как я думал, что доступ к любым данным с нулевым выбросит NullPointerException. Есть ли время, когда возникает исключение при доступе к массиву с нулевыми значениями?

Или это system.out.println(), сберегающая грация? Можете ли вы получить доступ к любому нулевому значению с циклом for, если вы не произнесете вызов data.length() на нем?

+3

Вы можете «обрабатывать» нулевую ссылку, вы просто не можете вызывать методы на ней. –

ответ

4

Объединение строк определяются в JLS как безопасная операции, когда операнд является пустой ссылкой, то есть он не бросает исключение какого-либо (что было бы в случае, если он попытался описать объект с .toString()) и Вместо этого следует использовать текст "null".

Проверка безопасности является не запускается, когда распаковка требуется:

Integer val = null; 
int err = val + 1; // throws NPE 

Просто для любопытства, доступ к любому статическому методу на нулевую ссылке даже не нужен чек, потому что связывание происходит во время компиляции:

public class NullRefStatic { 

    public static void test() { // <-- static method 
     System.out.println("It works"); 
    } 

    public static void main(String... args) { 
     NullRefStatic target = null; 
     target.test(); // <-- Prints "It works" 
    } 
} 
+0

Так что я предполагаю, что это то, что мне нужно будет извлечь из опыта, какие методы безопасны для выполнения на нулевых объектах. – mc805

+1

На самом деле это проще: доступ к нулевой ссылке ** всегда ** выбрасывает NPE. Конкатенация строк проверяет только ** перед ** вызовом toString() – Raffaele

+0

Итак, в некотором смысле печать имеет уже установленную нулевую проверку, но обычно ожидают NPE. Имеет смысл. Статический метод тоже интересен. – mc805

0

Таким образом, он распечатывает значение объекта, которое в этом случае будет пустым.

Исключено исключение нулевого указателя, если вы попытались использовать его или получить доступ к любым свойствам, поскольку они еще не существуют, следовательно, исключение нулевого указателя.

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