【问题标题】:How to avoid force close when read null value读取空值时如何避免强制关闭
【发布时间】:2013-09-10 07:14:33
【问题描述】:

我用 Apache.POI 编写简单的 android 应用程序来读取文档属性, 但是当它尝试读取具有空属性的文档时,它将强制关闭..

例如,我使用 getDocumentSummaryInformation() 然后使用 getCompany().. 但是当文档属性在字段 Company 中没有任何值时,它将强制关闭。

如何处理这个问题? 抱歉我的英语不好,感谢您的关注。

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hwpf.*;
import java.io.*;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getInit();

        cata = "";
        compa = "";

        readMyDocument(fileName);

        try {

                category.setText(cata);
            company.setText(compa);

        } catch (Exception e) {

            category.setText("Unknown Category");
            company.setText("Unknown Company");

        }

}



String fileName = "/sdcard/Test.doc";
public static String cata, compa;

public static void readMyDocument(String fileName){
    POIFSFileSystem fs = null;


    try {
        fs = new POIFSFileSystem(new FileInputStream(fileName));
        HWPFDocument doc = new HWPFDocument(fs);

        /** Read the document summary**/
        readDocumentSummary(doc);

    } catch (Exception e) {
        e.printStackTrace();

    }       
}   



public static MainActivity readDocumentSummary(HWPFDocument doc) {
    DocumentSummaryInformation summaryInfo=doc.getDocumentSummaryInformation();
    SummaryInformation summaryInfo2=doc.getSummaryInformation();

    MainActivity adata = new MainActivity();

        try{
        String category = summaryInfo2.getAuthor();
        adata.cata = category;
        }catch (Exception e) {
            Log.e("MainActivity", "Error occurred!, Error = "+e.toString());

        }

        try{
            String company = summaryInfo.getCompany();
            adata.compa = company;
            }catch (Exception e) {
            Log.e("MainActivity", "Error occurred!, Error = "+e.toString());

            }

    return adata;


}

TextView category;
TextView company;

public void getInit() {

    category = (TextView) findViewById(R.id.category);
    company = (TextView) findViewById(R.id.company);

}
}

日志:

FATAL EXCEPTION: main
java.lang.NoSuchFieldError: org.apache.poi.hwpf.HWPFDocument.filesystem
at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:218)
at org.apache.poi.hwpf.HWPFDocument.<init>(HWPFDocument.java:158)
at com.ajs.metaxdc.MainActivity.readMyDocument(MainActivity.java:155)
at com.ajs.metaxdc.MainActivity.onCreate(MainActivity.java:87)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
at android.app.ActivityThread.access$2300(ActivityThread.java:125)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
at dalvik.system.NativeStart.main(Native Method)
Force finishing activity com.ajs.metaxdc/.MainActivity

【问题讨论】:

标签: java android hwpf


【解决方案1】:
// Try this one
try{
    // write your code here
}catch(Exception e){
    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    您的代码必须遇到 NullPointerException。因此,您需要将代码封装在 try/catch 块中。如果在 catch 块中需要,捕获异常将允许您执行一些纠正措施。你的代码也可以继续执行这样的事情:

    try {
    // read doc properties here
    }catch(NullPointerException npe) {
    
    }
    

    通常最好在调用方法之前检查对象是否为 null 以避免 NullPointerException。所以其他方式可能是:

    if(yourDocObj == null) {
    //don't call get methods on yourDocObj
    } else {
    //call get methods on yourDocObj
    }
    

    【讨论】:

    • 您还有什么建议吗?因为即使我在 NullpointerException 块中放入代码让 textview 空白(此 try_catch 替换 getCompany 和 getAuthor 的 if_else 方法),它仍然强制关闭
    【解决方案3】:

    只需简单地使用Try and Catch 块,这样您就可以处理Catch 块中的NPE 异常。

    示例代码;

    try
    {
     //Your functionality
     ....
    }
    
    Catch(Exception e)
    {
     //Handle the Null Pointer Exception here.
     Log.e("YOUR_ACTIVITY_NAME", "Error occurred!, Error = "+e.toString());
    ....
    }
    

    我希望这能解决你的问题。

    【讨论】:

    • 感谢您的回复。您对我在异常块中的操作有什么建议吗?
    • 嗯,我认为你应该在你的 catch 块中使用 Logs 并根据你在 Catch 块中收到的错误日志修改你的代码。
    • 请检查编辑后的答案,您将能够在代码执行时看到LogCat中的所有日志。
    • 谢谢,我从我的设备中得到了错误日志。但仍然无法解决这个错误
    • 请将MainActivity.java文件的完整代码贴出来,我们将能够解决您的问题。
    【解决方案4】:

    我只是离开 hwpf 函数并改用 hpsf。因为没有人可以帮助找到 hwpf 属性字段中空值的解决方案。 感谢所有试图帮助我的人

    【讨论】:

      【解决方案5】:

      您可以通过在Try-Catch 块之间编写代码来避免强制关闭或一些异常

      试试下面的代码。

      try {
          // your code where force close occurs.
      } catch(Exception e) {
          System.out.println("Error Message : " + e.getMessage());
      }
      

      在文件中写入异常时检查此

      【讨论】:

      • 感谢您的回复。我可以将这些错误日志从 android 设备写入某个文件,然后像普通文本文件一样读取它吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 2020-03-30
      • 2014-09-11
      • 2017-02-15
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多