Java赋值的空指针异常
我有一个任务,我必须从一个文件(或标准输入,如果没有提供文件)中获取URL,然后计算方案等于某些内容的次数以及域等于某些内容的次数 这是我代码的一部分,它接受输入,将其拆分为scheme和domain,然后在找到某些单词时增加变量。然而,我不断得到Java赋值的空指针异常,java,nullpointerexception,Java,Nullpointerexception,我有一个任务,我必须从一个文件(或标准输入,如果没有提供文件)中获取URL,然后计算方案等于某些内容的次数以及域等于某些内容的次数 这是我代码的一部分,它接受输入,将其拆分为scheme和domain,然后在找到某些单词时增加变量。然而,我不断得到NullPointerException,我不知道为什么。现在,这段代码在第16行出现了一个错误。任何帮助都将不胜感激 File file = new File("input"); Scanner scan = new Scanner("input")
NullPointerException
,我不知道为什么。现在,这段代码在第16行出现了一个错误。任何帮助都将不胜感激
File file = new File("input");
Scanner scan = new Scanner("input");
Scanner scan2 = new Scanner(System.in);
while (!scan.next().equals("end") || !scan2.next().equals("end")) {
if (scan.hasNext() == true) {
url = scan.nextLine();
}
String[] parts = url.split(":");
scheme = parts[0];
schemeSP = parts[1];
if (scheme == "http") {
httpCt++;
}
if (scheme == "https") {
httpsCt++;
}
if (scheme == "ftp") {
ftpCt++;
} else {
otherSchemeCt++;
}
for (int j = 0; j < schemeSP.length(); j++) {
if (schemeSP.charAt(j) == '.') {
domain = schemeSP.substring(j);
}
}
if (domain == "edu") {
eduCt++;
}
if (domain == "org") {
orgCt++;
}
if (domain == "com") {
comCt++;
} else {
otherDomainCt++;
}
fileLinesCt++;
totalLinesCt++;
}
File File=新文件(“输入”);
扫描仪扫描=新扫描仪(“输入”);
扫描仪scan2=新扫描仪(System.in);
而(!scan.next().equals(“end”)| |!scan2.next().equals(“end”)){
if(scan.hasNext()==true){
url=scan.nextLine();
}
String[]parts=url.split(“:”);
方案=零件[0];
schemeSP=零件[1];
如果(方案==“http”){
httpCt++;
}
如果(方案==“https”){
httpsCt++;
}
如果(方案==“ftp”){
ftpCt++;
}否则{
otherSchemeCt++;
}
对于(int j=0;j
您的测试如下
if (scheme == "http")
将始终为false,因为==
比较身份-即它们是同一个精确对象
改用equals()
:
if (scheme.equals( "http"))
它可以进行值比较。我注意到一个特别突出的问题
File file = new File("input");
Scanner scan = new Scanner("input");
Scanner
正在使用,而不是文件
构造函数。我相信你本打算这么做的:
Scanner scan = new Scanner(new File("input"));
如果没有它,您将扫描“输入”一词
此外,您没有正确比较字符串。您总是将它们与.equals()
方法进行比较
任何像scheme==“http”
这样的语句都应该改为“http”.equals(scheme)
。第16行是从这个代码段的顶部开始还是从常规文件的第16行开始?据我所知,代码段中的第16行是'else otherSchemeCt++;',这可能是现在给你的例外。你到底在哪一行得到NPE(双击查看)?此外,为了避免在某些情况下出现NPE,请反转“equals”函数参数,使常数成为第一个参数。例如:!“end”.equals(scant.next())。另外,为了检查字符串是否等于常量,请始终使用“等于”,如何证明scheme==“http”始终为false?然而,比较字符串的正确方法当然是equals方法。@ukaszRzeszotarski唯一可能为真的方法是ifscheme=“http”代码>首先发生。Google“java字符串interning”和java==运算符这当然是正确的,我完全同意正确的解决方案是使用equals方法。但这并不能证明scheme==“http”总是错误的。在这种情况下,java字符串池如何?@ukaszRzeszotarski不可能是==。字符串不是那样工作的。scanner的实现不会插入返回的字符串。我已经按照你的建议更新了扫描线,但是我有几个问题要问。我不知道具体文件的名称,所以它需要能够接受任何文件。然后,如果没有提供任何文件,则需要通过System.in接收行。这条线可以吗?