Android eclipse运行时的nullpointexceptionerror

时间:2013-01-15 23:17:12

标签: android eclipse

我在运行时不断收到Nullpointexceptionerror。根据logcat,错误是由第43行引起的:

Database databaseNieuw = new Database(new File(naamDatabase), Version.DBASE_4); 

该行中唯一可能引发此类错误的是naamDatabase,它是从EditText字段获取的String。这两个都定义在第43行之上。

非常感谢任何帮助。

logcat的:

01-15 23:44:40.292: E/Trace(20437): error opening trace file: No such file or directory     (2)
01-15 23:44:46.769: E/AndroidRuntime(20437): FATAL EXCEPTION: main
01-15 23:44:46.769: E/AndroidRuntime(20437): java.lang.NullPointerException
01-15 23:44:46.769: E/AndroidRuntime(20437):    at nl.knaw.dans.common.dbflib.Database.<init>(Database.java:112)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at nl.knaw.dans.common.dbflib.Database.<init>(Database.java:64)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at com.example.bosbouwapp.screen1$2.onClick(screen1.java:43)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.view.View.performClick(View.java:4102)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.view.View$PerformClick.run(View.java:17085)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.os.Handler.handleCallback(Handler.java:615)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.os.Handler.dispatchMessage(Handler.java:92)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.os.Looper.loop(Looper.java:155)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at android.app.ActivityThread.main(ActivityThread.java:5454)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at java.lang.reflect.Method.invokeNative(Native Method)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at java.lang.reflect.Method.invoke(Method.java:511)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:796)
01-15 23:44:46.769: E/AndroidRuntime(20437):    at dalvik.system.NativeStart.main(Native Method)

代码:

package com.example.bosbouwapp;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import nl.knaw.dans.common.dbflib.Database;
import nl.knaw.dans.common.dbflib.Field;
import nl.knaw.dans.common.dbflib.InvalidFieldLengthException;
import nl.knaw.dans.common.dbflib.InvalidFieldTypeException;
import nl.knaw.dans.common.dbflib.Type;
import nl.knaw.dans.common.dbflib.Version;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class screen1 extends Activity {

    /** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen1);

    Button terug = (Button) findViewById(R.id.button2);    
    terug.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent myIntent = new Intent(view.getContext(), home.class);
            startActivityForResult(myIntent, 0);
        }

    });

    Button next = (Button) findViewById(R.id.button3);
     next.setOnClickListener(new View.OnClickListener() {
         public void onClick(View view) {

                EditText databaseNaam = (EditText)    findViewById(R.id.database_naam);
                String naamDatabase = databaseNaam.getText().toString();
                Database databaseNieuw = new Database(new File(naamDatabase), Version.DBASE_4);            
                Global g = (Global) getApplication();
                List<Field> fields = new ArrayList<Field>();
                List<Field> fields2 = new ArrayList<Field>();

      if (naamDatabase.trim().equals("")) {
        Toast.makeText(getApplication(), "Veld is leeg", Toast.LENGTH_SHORT).show();
      }  
      else{

    fields.add(new Field("Stapel", Type.NUMBER, 3));
    fields.add(new Field("Boomsoort", Type.CHARACTER, 25));
    fields.add(new Field("Diameter", Type.NUMBER, 4));
    fields.add(new Field("Lengte", Type.NUMBER, 2));
    fields.add(new Field("Overig", Type.CHARACTER, 150));
    try {
        databaseNieuw.addTable("Boomstam", fields);
    } catch (InvalidFieldTypeException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (InvalidFieldLengthException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    fields2.add(new Field("Stapel", Type.CHARACTER, 50));
    fields2.add(new Field("Datum", Type.DATE));
    fields2.add(new Field("X", Type.NUMBER, 20));
    fields2.add(new Field("Y", Type.NUMBER, 20));
    fields2.add(new Field("Houtsoort", Type.CHARACTER, 50));


    try {
        databaseNieuw.addTable("Houtstapel", fields2);
    } catch (InvalidFieldTypeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidFieldLengthException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    g.setDatabaseNieuw(databaseNieuw);      
    Intent myIntent = new Intent(view.getContext(), screen3.class);
            startActivityForResult(myIntent, 0);


        }

    }


    });
}
}  

修改

我目前正在调查Database.class。因为我不能真正地做出正面或反面(还),也许其他人可以。

Database.class代码:

// Decompiled by DJ v3.12.12.96 Copyright 2011 Atanas Neshkov  Date: 1/16/2013 12:48:01 AM
// Home Page: http://members.fortunecity.com/neshkov/dj.html  http://www.neshkov.com/dj.html - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   Database.java

package nl.knaw.dans.common.dbflib;

import java.io.File;
import java.nio.charset.Charset;
import java.util.*;

// Referenced classes of package nl.knaw.dans.common.dbflib:
//            Table, Version, InvalidFieldTypeException, InvalidFieldLengthException

public class Database
{

public Database(File databaseDirectory, Version version)
{
    this(databaseDirectory, version, Charset.defaultCharset().name());
}

public Database(File databaseDirectory, Version version, String charsetName)
{
    tableMap = new HashMap();
    if(databaseDirectory == null || databaseDirectory.isFile())
        throw new IllegalArgumentException("Database must be a directory ");
    if(!databaseDirectory.exists())
        databaseDirectory.mkdirs();
    this.databaseDirectory = databaseDirectory;
    this.version = version;
    this.charsetName = charsetName != null ? charsetName : Charset.defaultCharset().name();
    Charset.forName(this.charsetName);
    String fileNames[] = databaseDirectory.list();
    String arr$[] = fileNames;
    int len$ = arr$.length;
    for(int i$ = 0; i$ < len$; i$++)
    {
        String fileName = arr$[i$];
        if(fileName.toLowerCase().endsWith(".dbf") && fileName.length() > ".dbf".length())
            addTable(fileName);
    }

}

public Set getTableNames()
{
    return Collections.unmodifiableSet(tableMap.keySet());
}

public Table getTable(String name)
{
    return (Table)tableMap.get(name);
}

public Table addTable(String name, List fields)
    throws InvalidFieldTypeException, InvalidFieldLengthException
{
    Table table = (Table)tableMap.get(name);
    if(table == null)
    {
        table = new Table(new File(databaseDirectory, name), version, fields);
        tableMap.put(name, table);
    }
    return table;
}

private void addTable(String name)
{
    Table table = (Table)tableMap.get(name);
    if(table == null)
    {
        table = new Table(new File(databaseDirectory, name), charsetName);
        tableMap.put(name, table);
    }
}

public void removeTable(String name)
{
    tableMap.remove(name);
}

public void removeTable(Table table)
{
    tableMap.remove(table.getName());
}

public String getCharsetName()
{
    return charsetName;
}

private final File databaseDirectory;
private final Map tableMap;
private final Version version;
private final String charsetName;
}

2 个答案:

答案 0 :(得分:1)

您是否可以在代码中添加一个断点并逐步执行它以查看您是否尝试在非初始化对象上的任何位置进行调用,或者将空对象传递给Database类?在第43行传递时,具体确认naamDatabase不为空?此字符串也是您在调用时所期望的字符串吗?

更新

正如我在评论中注意到的那样,当踩到下面文件对象的状态时:

File file = new File(naamDatabase);

此处断点 - 检查文件对象不为空

Database databaseNieuw = new Database(file, Version.DBASE_4);

答案 1 :(得分:0)

此处的错误位于Database类中,并且没有看到无法跟踪问题。如果您确定要传递到Database的所有内容都不为null,那么应该责备数据库类。

我建议与创建该数据库类的人联系,无论它做什么!