在项目中的一处有如下的代码片段:
ArrayList<SmsInfo> infos = SmsPicker.getInstance(this).getSmsInfo();

System.out.println("infos.size()--->" + infos.size());
for(SmsInfo info:infos) {
System.out.println(info.getName());
}
运行后出现以下异常:
02-24 02:16:58.780: ERROR/AndroidRuntime(2249): Caused by: java.lang.NullPointerException
02-24 02:16:58.780: ERROR/AndroidRuntime(2249):     at com.android.internal.os.LoggingPrintStream.println(LoggingPrintStream.java:298)
02-24 02:16:58.780: ERROR/AndroidRuntime(2249):     at com.weining.view.activity.SMSBakActivity.initLv(SMSBakActivity.java:69)
02-24 02:16:58.780: ERROR/AndroidRuntime(2249):     at com.weining.view.activity.SMSBakActivity.onCreate(SMSBakActivity.java:35)
02-24 02:16:58.780: ERROR/AndroidRuntime(2249):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-24 02:16:58.780: ERROR/AndroidRuntime(2249):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)我是通过Sysout来打印调试消息的,找来找去发现for遍历中info.getName()的为null,好,我猜问题出在System.out.println()方法中,让我不解的是在之前做的java项目中,Sysout输出对象时,即使对象为空,也可以输出对象为null,而android项目中竟然报空指针异常了!
后来我加以验证,写了两行代码:
String str = null;
System.out.println(str);
运行在两个不同的工程中,一个是最普通的java工程中的main方法中,好,正常输出null,而在另一个android工程中,就报空指针异常了!
问题来了,它们都用的是java源码:
294    @Override  
295    public synchronized void println(String s) {  
296        if (builder.length() == 0) {  
297            // Optimization for a simple println.  
298            int length = s.length();  
299  
300            int start = 0;  
原来这段代码没有判断s是否为空指针而直接取length了,但我不解的是在普通的java工程中为何不会报空指针异常而直接输出null呢?

解决方案 »

  1.   

    因为你的info是空的,而不是info.getName()是空的
    还有,提醒你一下,最好不要用foreach,经常出问题,有时候只是简单的换成for就好了...
      

  2.   

    info是不空的,info.getName()是空的
      

  3.   

    如果info.getName()为空的时候你要打印,你可以在后面加 +""
      

  4.   

    可能是区分的不够吧  null可能会理解成String把 
      

  5.   

    很显然,你的info是个空引用。
      

  6.   

    根据我的观察,android有时会报异常,但有时不报,原因不明。或许是哪里被catch掉了??