android java try{} catch () 另类应用

try catch在android中常用来处理java中出现的异常,这里我要介绍的是一个的是用它来debug java,特别是一些应用出问题,而从log里面有没有有用的信息的时候。

下面以我在debug某微盘程序微盘的apk为列:

现象,用这个应用程序上传大文件的时候出错,而且只有移动卡才有问题。一看这个现象可能都以为是移动网络的问题,但你看了device log 和tcpdump以后你会发现网络根本没有问题,而且每一次中断都是有client启动的。请看下面的log

05-0214:33:05.582  3603  3658 I global  : call socket close inSocketHttpClientConnection,socket=Socket[address=/60.28.2.174,port=80,localPort=35051]

05-0214:33:05.582  3603  3658 I global  : close connection by catchIOException when requestExec

  


从这里能判断出数据传输的终止是由上层app引起的,你要是把你的想法跟pm说他们肯定不同意,因为联通的卡是好的。所以问题就来了,怎么证明这个是app的问题呢? 也就是说要print出应用程序的call stack,在java里面一般有两种方法,说实话这里我两种都试过了,这里只是介绍怎么用try catch来触发。

    从log看也就是,上层吧socket关掉了,我们也就从这里入手。


 public void close() throws IOException {
       int[] p;

        if (!this.open) {
            return;
        }
        this.open = false;
        doFlush();
        try {
            try {
                this.socket.shutdownOutput();
            } catch (IOException ignore) {
            }
            try {
                this.socket.shutdownInput();
            } catch (IOException ignore) {
            }
        } catch (UnsupportedOperationException ignore) {
            // if one isn't supported, the other one isn't either
        }
        Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection, socket="+this.socket.toString());
           this.socket.close(); -》自然会想到这个函数加try catch,但是你会发现这个没有exception,每次都是正常关闭,怎么是关闭的时候抛出异常呢?
    }

 this.socket.close(); -》改为下面

        try
        {


  if(this.socket.toString().contains("address=/60.28.2.225,port=80") ||this.socket.toString().contains("address=/60.28.2.174,port=80") )
  {
                p=new int[1];
         //p[2]  = 1; //remove it,it just for debug ,tigger crash
  
      }
           this.socket.close();
           Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection again, socket="+this.socket.toString());
  //the following try to make service crash.
           this.socket.close();两次close socket确保会产生exception
           
        }catch(IOException ex)
        {    
             Logger.global.log( Level.INFO,"call socket close in SocketHttpClientConnection->already closed before "+ ex);
             throw ex;
         }

}

    这样的话exception就来了,你可以根据这里顺藤摸瓜,找出真正的问题。最后发现是微盘的问题。

   vdisk.net.ComplexUploadInputStreamEntity.judgeTransfer 抛出异常导致http把socket关掉了,最后联系vendor一起把这个问题解决吧。

05-1011:08:10.999  2544  2863 I global  : HttpRequestExecutor->execute:IOExceptionjava.io.IOException

05-1011:08:10.999  2544  2863 W System.err: java.io.IOException

05-1011:08:10.999  2544  2863 W System.err:      atcom.vdisk.net.ComplexUploadInputStreamEntity.judgeTransfer(ComplexUploadInputStreamEntity.java:121)

05-1011:08:10.999  2544  2863 W System.err:      atcom.vdisk.net.ComplexUploadInputStreamEntity.writeTo(ComplexUploadInputStreamEntity.java:74)

05-1011:08:10.999  2544  2863 W System.err:      atcom.vdisk.net.ProgressListener$ProgressHttpEntity.writeTo(ProgressListener.java:62)

05-1011:08:10.999  2544  2863 W System.err:      atorg.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97)

05-1011:08:10.999  2544  2863 W System.err:      atorg.apache.http.impl.AbstractHttpClientConnection.sendRequestEntity(AbstractHttpClientConnection.java:162)

05-1011:08:10.999  2544  2863 W System.err:      atorg.apache.http.impl.conn.AbstractClientConnAdapter.sendRequestEntity(AbstractClientConnAdapter.java:278)

05-1011:08:11.019  2544  2863 W System.err:      atorg.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:248)

05-1011:08:11.019  2544  2863 W System.err:      atorg.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:122)

05-1011:08:11.019  2544  2863 W System.err:      atorg.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:435)

05-1011:08:11.019  2544  2863 W System.err:      atorg.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:593)

05-1011:08:11.019  2544  2863 W System.err:      atorg.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:510)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.RESTUtility.execute(RESTUtility.java:625)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.VDiskAPI$ComplexUploadRequest.upload(VDiskAPI.java:1574)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.VDiskAPI.startComplexUpload(VDiskAPI.java:2592)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.VDiskAPI.putLargeFileRequest(VDiskAPI.java:2503)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.VDiskAPI.putLargeFileOverwriteRequest(VDiskAPI.java:2417)

05-1011:08:11.019  2544  2863 W System.err:      atcom.sina.weipan.server.async.ComplexUploadAsyncTask.doInBackground(ComplexUploadAsyncTask.java:108)

05-1011:08:11.019  2544  2863 W System.err:      atcom.sina.weipan.server.async.ComplexUploadAsyncTask.doInBackground(ComplexUploadAsyncTask.java:1)

05-1011:08:11.019  2544  2863 W System.err:      atcom.vdisk.net.VdiskAsyncTask$2.call(VdiskAsyncTask.java:188)

05-1011:08:11.019  2544  2863 W System.err:      atjava.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

05-1011:08:11.019  2544  2863 W System.err:      atjava.util.concurrent.FutureTask.run(FutureTask.java:137)

05-1011:08:11.019  2544  2863 W System.err:      atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)

05-1011:08:11.019  2544  2863 W System.err:      atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)

05-1011:08:11.019  2544  2863 W System.err:      atjava.lang.Thread.run(Thread.java:864)

 


     




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值