对于我所拥有的类,我必须接受参数,这些参数将是每行上具有不同URL的文件,并通过这些行来计算每个url具有不同方案和不同域的次数。如果没有参数,那么我必须直接扫描输入的内容。我得到了以下代码,其中包括除最后的printlns之外的所有内容。
import java.util.Scanner;
public class P1 {
public static void main(String[] args){
int fileLinesCt=0, totalLinesCt=0;
int httpCt=0, httpsCt=0, ftpCt=0, otherSchemeCt=0;
int eduCt=0, orgCt=0, comCt=0, otherDomainCt=0;
String url, scheme, schemeSP, domain = null;
Scanner scan = null;
if(!args.equals(null)){
for (int j=0; j<args.length; j++){
scan = new Scanner(args[j]);
fileLinesCt = 0;
while (!"end".equals(scan.nextLine())){
url = scan.nextLine();
String[] parts = url.split("//://");
scheme = parts[0];
schemeSP = parts[1];
if ("http".equals(scheme))
httpCt++;
if ("https".equals(scheme))
httpsCt++;
if ("ftp".equals(scheme))
ftpCt++;
else otherSchemeCt++;
for (int i=0; i<schemeSP.length(); i++){
if (schemeSP.charAt(j) == '.')
domain = schemeSP.substring(j,'/');
if (schemeSP.charAt(j) == '/')
break;
}
if ("edu".equals(domain))
eduCt++;
if ("org".equals(domain))
orgCt++;
if ("com".equals(domain))
comCt++;
else otherDomainCt++;
fileLinesCt++;
totalLinesCt++;
if (fileLinesCt == 1)
System.out.println(">> Got " + fileLinesCt + " line from " + scan);
else System.out.println(">> Got " + fileLinesCt + " lines from " + scan);
}
}
}
else {
Scanner scanner = new Scanner(System.in);
fileLinesCt = 0;
while (!scanner.next().equals("end")){
url = scanner.next();
String[] parts = url.split("//://");
scheme = parts[0];
schemeSP = parts[1];
if ("http".equals(scheme))
httpCt++;
if ("https".equals(scheme))
httpsCt++;
if ("ftp".equals(scheme))
ftpCt++;
else otherSchemeCt++;
for (int j=0; j<schemeSP.length(); j++){
if (schemeSP.charAt(j) == '.')
domain = schemeSP.substring(j,'/');
if (schemeSP.charAt(j) == '/')
break;
}
if ("edu".equals(domain))
eduCt++;
if ("org".equals(domain))
orgCt++;
if ("com".equals(domain))
comCt++;
else otherDomainCt++;
fileLinesCt++;
totalLinesCt++;
if (fileLinesCt == 1)
System.out.println(">> Got " + fileLinesCt + " line from " + scan);
else System.out.println(">> Got " + fileLinesCt + " lines from " + scan);
}
}
运行代码时,出现错误
“在命令行上列出文件时程序失败 线程“main”中的异常java.util.NoSuchElementException:无行 发现“当它试图扫描下一行时,这发生在第15行。
我做错了什么会阻止它扫描下一行?
答案 0 :(得分:2)
多数民众赞成是因为你打电话给scan.nextLine
两次
while (!"end".equals(scan.nextLine())){
url = scan.nextLine();
你应该这样做:
while ( !("end".equals((url = scan.nextLine()))) ) {
...
}
答案 1 :(得分:0)
您正在每次跑步的开始时跳过一条线。
scan.nextLine()
使扫描程序超过正在返回的行,所以
while (!"end".equals(scan.nextLine())){
url = scan.nextLine();
表示url
包含第二个行。这也意味着它可能会跳过最终条件,导致它试图读取不存在的行。
scan.hasNextLine()
是检查您要查找的文件末尾的方法。
答案 2 :(得分:0)
以下声明
if(!args.equals(null)){
可以通过
切换if(args.length > 0){
在String数组.equals
中使用args
后,未说明是否包含元素。
答案 3 :(得分:0)
args永远不会为空(我相信),请尝试args.length!= 0。