Question

I write simple android application to read document properties with Apache.POI, but when it try to read document with null properties it will force close..

for example I use getDocumentSummaryInformation() then use getCompany().. but when the document properties doesn't have any value in field Company then it will force closed.

How to handle this problem? Sorry for my poor english and thank you for your attention.

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);

}
}

Log:

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
Was it helpful?

Solution 4

I just leave hwpf function and use hpsf instead.. Because no one can help find solution to null value in hwpf property field. Thank you for all people who tried to help me

OTHER TIPS

// Try this one
try{
    // write your code here
}catch(Exception e){
    e.printStackTrace();
}

Your code must be encountering NullPointerException. So you need to encapsulate your code in try/catch block. Catching an exception will allow you to do some corrective action if required in catch block. Also your code can continue executing Something like this:

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

}

Generally it is good to check to whether the object is null before calling methods on that to avoid NullPointerException. So other way around could be:

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

Just simply use Try and Catch block, this way you will be able to handle the NPE exception in the Catch block.

Sample code;

try
{
 //Your functionality
 ....
}

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

I hope this solves your problem.

You can avoid force close or some Exception by writing code between Try-Catch blocks

Try with following code.

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

While to write exception in file Check this

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top