未捕获的异常错误android

时间:2013-02-27 20:47:15

标签: java android eclipse

我知道有很多这样的东西,但我还有一个给你们。我知道我在某处有一个空指针异常错误,但我不知道在哪里。 Java不是我最好的语言,所以我有点笨手笨脚。

我的logcat看起来像这样:

W/dalvikvm( 6062): threadid=1: thread exiting with uncaught exception (group=0x413e5438)
E/AndroidRuntime( 6062): FATAL EXCEPTION: main
E/AndroidRuntime( 6062): java.lang.NullPointerException
E/AndroidRuntime( 6062):    at com.zach.ReportingTool.ReportingTool$1.handleMessage(ReportingTool.java:152)
E/AndroidRuntime( 6062):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 6062):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 6062):    at android.app.ActivityThread.main(ActivityThread.java:4918)
E/AndroidRuntime( 6062):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 6062):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 6062):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
E/AndroidRuntime( 6062):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
E/AndroidRuntime( 6062):    at dalvik.system.NativeStart.main(Native Method)
E/android.os.Debug(  714): !@Dumpstate > dumpstate -k -t -z -d -o /data/log/dumpstate_app_error

我从开源项目here中获取了代码。该代码用于速度测试应用程序。我真正改变/删除的唯一事情是删除位于屏幕顶部的动画更新进度条,我删除了一个网络文本视图,指示速度是3g还是边缘。

启动代码按钮如下所示:

        bSpeed.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(final View view) {
            confirmation.setText("Test started");   
            bSpeed.setEnabled(false);
            new Thread(mWorker).start();    

        }
    });

其余代码如下所示:

    @SuppressLint("HandlerLeak")
private final Handler mHandler=new Handler(){
    @Override
    public void handleMessage(final Message msg) {
        try {
        switch(msg.what){
        case MSG_UPDATE_STATUS:
            final SpeedInfo info1=(SpeedInfo) msg.obj;
            speed.setText(String.format(getResources().getString(R.string.update_speed), mDecimalFormater.format(info1.kilobits)));
            progress.setText(String.format(getResources().getString(R.string.update_downloaded), msg.arg2, EXPECTED_SIZE_IN_BYTES));
            break;
        case MSG_UPDATE_CONNECTION_TIME:
            conspeed.setText(String.format(getResources().getString(R.string.update_connectionspeed), msg.arg1));
            break;              
        case MSG_COMPLETE_STATUS:
            final  SpeedInfo info2=(SpeedInfo) msg.obj;
            speed.setText(String.format(getResources().getString(R.string.update_downloaded_complete), msg.arg1, info2.kilobits));          
            progress.setText(String.format(getResources().getString(R.string.update_downloaded), msg.arg1, EXPECTED_SIZE_IN_BYTES));
            bSpeed.setEnabled(true);
            break;  
        default:
        super.handleMessage(msg);
        }
        } catch (Exception e) {confirmation.setText("6: " + e.getMessage());}
    }
};

private final Runnable mWorker=new Runnable(){      
    @Override
    public void run() {
        InputStream stream=null;
        try {
            int bytesIn=0;
            String downloadFileUrl="http://www.gregbugaj.com/wp-content/uploads/2009/03/dummy.txt"; 
            long startCon=System.currentTimeMillis(); 
            URL url=new URL(downloadFileUrl);
            URLConnection con=url.openConnection();
            con.setUseCaches(false);
            long connectionLatency=System.currentTimeMillis()- startCon;
            stream=con.getInputStream();

            Message msgUpdateConnection=Message.obtain(mHandler, MSG_UPDATE_CONNECTION_TIME);
            msgUpdateConnection.arg1=(int) connectionLatency;
            mHandler.sendMessage(msgUpdateConnection);

            long start=System.currentTimeMillis();
            int currentByte=0;
            long updateStart=System.currentTimeMillis();
            long updateDelta=0;
            int  bytesInThreshold=0;

            while((currentByte=stream.read())!=-1){ 
                bytesIn++;
                bytesInThreshold++;
                if(updateDelta>=UPDATE_THRESHOLD){
                    int progress=(int)((bytesIn/(double)EXPECTED_SIZE_IN_BYTES)*100);
                    Message msg=Message.obtain(mHandler, MSG_UPDATE_STATUS, calculate(updateDelta, bytesInThreshold));
                    msg.arg1=progress;
                    msg.arg2=bytesIn;
                    mHandler.sendMessage(msg);
                    //Reset
                    updateStart=System.currentTimeMillis();
                    bytesInThreshold=0;
                }
                updateDelta = System.currentTimeMillis()- updateStart;
            }

            long downloadTime=(System.currentTimeMillis()-start);
            if(downloadTime==0){
                downloadTime=1;
            }

            Message msg=Message.obtain(mHandler, MSG_COMPLETE_STATUS, calculate(downloadTime, bytesIn));
            msg.arg1=bytesIn;
            mHandler.sendMessage(msg);
        } 
        catch (MalformedURLException e) {
            confirmation.setText("1: " + e.getMessage());
        } catch (Exception e) {
            confirmation.setText("2: " + e.getMessage());
        }finally{
            try {
                if(stream!=null){
                    stream.close();
                }
            } catch (Exception e) { 
                confirmation.setText("3: " + e.getMessage());
            }
        }
    }
};

private SpeedInfo calculate(final long downloadTime, final long bytesIn){
    SpeedInfo info=new SpeedInfo();
    long bytespersecond   =(bytesIn / downloadTime) * 1000;
    double kilobits=bytespersecond * BYTE_TO_KILOBIT;
    double megabits=kilobits  * KILOBIT_TO_MEGABIT;
    info.downspeed=bytespersecond;
    info.kilobits=kilobits;
    info.megabits=megabits;
    return info;    
}

private static class SpeedInfo{
    public double kilobits=0;   
    public double megabits=0;
    public double downspeed=0;  
}
private static final int EXPECTED_SIZE_IN_BYTES = 1048576;
private static final double BYTE_TO_KILOBIT = 0.0078125;
private static final double KILOBIT_TO_MEGABIT = 0.0009765625;

private Button bSpeed;
private TextView conspeed;
private TextView progress;
private TextView speed;
private TextView confirmation;

private final int MSG_UPDATE_STATUS=0;
private final int MSG_UPDATE_CONNECTION_TIME=1;
private final int MSG_COMPLETE_STATUS=2;

private final static int UPDATE_THRESHOLD=300;
private DecimalFormat mDecimalFormater;
}

我认为错误的来源是case语句中的对象。 (ReportingTool.java:152)指向这一行:

     conspeed.setText(String.format(getResources().getString(R.string.update_connectionspeed), msg.arg1));

如果我对该行进行注释,则它会指向上一个case语句中该行上方的progress.setText()。忽略所有的try / catch块,我只是想缩小错误的来源。

如果有人能看一下这段代码,我们将不胜感激,谢谢-Z

更新

谢谢大家快速回复。在调试该行及其周围的行后,看起来像conspeed,speed和progress都返回null值,我是不是正确启动它们?

要启动我更新了所有内容以匹配“oncreate”中的内容:

    TextView speed = (TextView) findViewById(R.id.speed);
    TextView progress = (TextView) findViewById(R.id.progress);
    TextView connectionspeed = (TextView)findViewById(R.id.connectionspeed);

所以现在第152行是connectionspeed.setText()

更新2

这是Main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/textView3"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"  >

<TextView
    android:id="@+id/progress"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/bSip"
    android:layout_marginTop="16dp"
    android:text="@string/progress" />

<Button
    android:id="@+id/bSip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_marginLeft="29dp"
    android:text="@string/EnableSip" />

<TextView
    android:id="@+id/speed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/progress"
    android:text="@string/Speed"/>

<TextView
    android:id="@+id/connectionspeed"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/speed"
    android:text="@string/ConSpeed"/>

<Button
    android:id="@+id/bSpeed"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/progress"
    android:layout_alignParentRight="true"
    android:layout_marginRight="30dp"
    android:text="@string/SpeedTest" />

<TextView
    android:id="@+id/Confirmation"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/bmail"
    android:layout_marginTop="22dp"
    android:fitsSystemWindows="true"
    android:maxLines="@integer/MaxLines"
    android:scrollHorizontally="false"
    android:visibility="visible" />

<Button
    android:id="@+id/bmail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/connectionspeed"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="33dp"
    android:text="@string/Export" />

<Button
    android:id="@+id/bDelete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/bmail"
    android:layout_alignParentBottom="true"
    android:text="@string/deleteSelf" />

再次感谢-Z

3 个答案:

答案 0 :(得分:1)

有问题的第152行,请执行以下操作:

 if (conspeed == null){
      Log.e("TAG", "conspeed is null!");
 }
 if (getResources() == null){
      Log.e("TAG", "getResources() is null!");
 }
 if (msg == null){
      Log.e("TAG", "msg is null!");
 }
 conspeed.setText(String.format(getResources().getString(R.string.update_connectionspeed), msg.arg1));

然后你会知道null是什么,下一步就是找出原因。

修改

我看到你正在使用findViewById。在您的XML文件中,您是否实际定义了那些与您要查找的id字段匹配的TextView?像这样:android:id="@+id/speed"

编辑2

嗯,你的XML看起来还不错。你在onCreate()中这样做的事实让我相信你或许只是过早地称呼这些。请参阅此帖:findViewByID returns null

尝试重新分解代码,以便在初始化UI的所有内容后进行此调用?它可能是null,因为尚未设置所有内容。

答案 1 :(得分:0)

NullPointerException将位于handleMessage方法所在的文件的第152行(ReportingTool.java

查看该行正在发挥的变量;至少有一个是null而你正在尝试对其进行操作,导致异常。

答案 2 :(得分:0)

所以我想通了,而且我似乎也很愚蠢。

当我初始化时:

TextView speed = (TextView) findViewById(R.id.speed);
TextView progress = (TextView) findViewById(R.id.progress);
TextView connectionspeed = (TextView)findViewById(R.id.connectionspeed);
TextView confirmation = (TextView) findViewById(R.id.speed);

我也在初始化:

private TextView connectionspeed;
private TextView progress;
private TextView speed;
private TextView confirmation;

我在onCreate()中应该只是:

speed = (TextView) findViewById(R.id.speed);
progress = (TextView) findViewById(R.id.progress);
connectionspeed = (TextView)findViewById(R.id.connectionspeed);
confirmation = (TextView) findViewById(R.id.speed);

我认为.Net等价物会调用Dim或var两次......我想......无论如何,我拿出了TextView部分,它现在可以工作了。如果有人有更好的解释,我会全力以赴。