2

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

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

该行中唯一可能引发此类错误的是 naamDatabase,它是从 EditText 字段获取的字符串。它们都在第 43 行以上定义。

任何帮助将不胜感激。

日志猫:

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;
}
4

2 回答 2

1

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

更新

正如我在评论中指出的那样,在单步执行以下文件对象的状态时:

File file = new File(naamDatabase);

断点在这里 - 检查文件对象不为空

Database databaseNieuw = new Database(file, Version.DBASE_4);
于 2013-01-15T23:46:16.493 回答
0

这里的错误在 Database 类中,并且没有看到无法跟踪问题。如果您确定传递给 Database 的所有内容都不为 null,那么应该归咎于 Database 类。

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

于 2013-01-15T23:23:37.180 回答