我编写简单的android应用程序来使用Apache.POI读取文档属性, 但是当它尝试读取具有null属性的文档时,它会强制关闭..
例如我使用getDocumentSummaryInformation()然后使用getCompany().. 但是当文档属性在字段公司中没有任何值时,它将强制关闭。
如何处理这个问题? 抱歉我的英文不好,谢谢你的关注。
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
答案 0 :(得分:0)
// Try this one
try{
// write your code here
}catch(Exception e){
e.printStackTrace();
}
答案 1 :(得分:0)
您的代码必须遇到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
}
答案 2 :(得分:0)
您可以通过在Try-Catch
块
尝试使用以下代码。
try {
// your code where force close occurs.
} catch(Exception e) {
System.out.println("Error Message : " + e.getMessage());
}
在文件中写异常时检查此
答案 3 :(得分:0)
只需使用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());
....
}
我希望这能解决你的问题。
答案 4 :(得分:0)
我只是留下hwpf函数并使用hpsf代替..因为没有人可以帮助在hwpf属性字段中找到null值的解决方案。 感谢所有试图帮助我的人