如何修复给定代码中的 java.lang.NullPointerException?

问题描述 投票:0回答:5

当我运行下面的程序(在 NETBEANS 6.1.0 中)时,我在第 21 行和第 49 行收到“java.lang.NullPointerException”。我是 java 新手,请帮助修复该错误。

第 21 行。database.loadFile(fileToPath("contextPasquier99.txt"));

第 49 行. return java.net.URLDecoder.decode(url.getPath(),"UTF-8");



  package ca.pfv.spmf.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;

import ca.pfv.spmf.algorithms.frequentpatterns.eclat_and_charm.AlgoCharm;
import ca.pfv.spmf.input.transaction_database_list_integers.TransactionDatabase;
import ca.pfv.spmf.patterns.itemset_set_integers_with_tids.Itemsets;

/**
 * Example of how to use the CHARM algorithm from the source code.
 * @author Philippe Fournier-Viger (Copyright 2009)
 */
   public class MainTestCharm_saveToMemory {

public static void main(String [] arg) throws IOException{
    // Loading the transaction database
    TransactionDatabase database = new TransactionDatabase();
    try {
        database.loadFile(fileToPath("contextPasquier99.txt"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    database.printDatabase();

    // Applying the Charm algorithm
    AlgoCharm algo = new AlgoCharm();
    Itemsets closedItemsets = algo.runAlgorithm(null, database, 100000, 0.4, true);
    // NOTE 0: We use "null" as output file path, because in this
    // example, we want to save the result to memory instead of
    // saving to a file

    // NOTE 1: if you  use "true" in the line above, CHARM will use
    // a triangular matrix  for counting support of itemsets of size 2.
    // For some datasets it should make the algorithm faster.

    // NOTE 2:  1000000 is the hashtable size used by CHARM for
    // storing itemsets.  Most users don't use this parameter.

    // print the statistics
    algo.printStats();
    // print the frequent itemsets found
    closedItemsets.printItemsets(database.size());
}

public static String fileToPath(String filename) throws UnsupportedEncodingException{
    URL url = MainTestCharm_saveToMemory.class.getResource(filename);
     return java.net.URLDecoder.decode(url.getPath(),"UTF-8");
}

}

我得到以下信息:

Exception in thread "main" java.lang.NullPointerException
        at ca.pfv.spmf.test.MainTestCharm_saveToMemory.fileToPath(MainTestCharm_saveToMemory.java:49)
        at ca.pfv.spmf.test.MainTestCharm_saveToMemory.main(MainTestCharm_saveToMemory.java:21)
java nullpointerexception
5个回答
1
投票

您的 .getResource(filename) 可能返回一个

null
。在使用
url
之前,您应该测试它是否有值;像这样的东西:

public static String fileToPath(String filename) throws UnsupportedEncodingException{
    URL url = MainTestCharm_saveToMemory.class.getResource(filename);

    if (url != null) {
        return java.net.URLDecoder.decode(url.getPath(),"UTF-8");
    }

    System.out.println("file: " + filename + "not found");
    System.exit(-1); // or return empty string or null
}

编辑: 为了使

getResource(filename)
在包外工作,文件名应以“/”开头;例如:

database.loadFile(fileToPath("/contextPasquier99.txt"));

如果它被称为:

database.loadFile(fileToPath("contextPasquier99.txt"));

它只会查看

package ca.pfv.spmf.test
内部。


1
投票

没有行号,这有点棘手,但我要冒险……

MainTestCharm_saveToMemory.class.getResource(filename);
返回什么? 我猜
null
,当你这样做时会在下一行导致 NPE
url.getPath()


1
投票

NullPointerException的原因位于第48行。

URL url = MainTestCharm_saveToMemory.class.getResource(filename);

当您尝试获取资源的 URL 时,您会得到

null
,如方法 getResource
documentation
中所述。因此,在运行代码之前必须检查资源是否存在。它将帮助您解决这个问题。顺便说一句,不要忘记该资源不是位于文件系统上任何位置的常规文件。它是位于用于加载类的搜索路径中的文件。


1
投票

大多数情况下,您的文件“contextPasquier99.txt”存在于某个路径中,但您可能没有指定完整的正确路径。

如果是的话你的

URL url = MainTestCharm_saveToMemory.class.getResource(filename);

对于无效文件路径返回 null,这会将空指针异常传播到下面的行

 return java.net.URLDecoder.decode(url.getPath(),"UTF-8");

因为 url 正在调用其方法,但似乎 url 为 null。

此异常会传播给调用者 i e

 database.loadFile(fileToPath("contextPasquier99.txt"));

0
投票

有时我们有

val uri = Uri.parse(url)
var fileName = URLDecoder.decode(uri.lastPathSegment, "UTF-8")

记住

uri.lastPathSegment
是可为 Null 的并且可能返回 null

/**
 * Gets the decoded last segment in the path.
 *
 * @return the decoded last segment or null if the path is empty
 */
@Nullable
public abstract String getLastPathSegment();

在继续解码之前,您应该始终检查路径是否不为空

val uri = Uri.parse(url)
if(uri.lastPathSegment != null)
var fileName = URLDecoder.decode(uri.lastPathSegment, "UTF-8")
© www.soinside.com 2019 - 2024. All rights reserved.