0

对于我拥有的一个类,我必须接受参数,这些参数将是每行具有不同 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);
        }
    }

运行代码时,我收到一条错误消息

“在命令行上列出文件时程序失败。
线程“主”java.util.NoSuchElementException 中的异常:未找到行“当它尝试扫描下一行时,这发生在第 15 行。

我做错了什么会阻止它扫描下一行?

4

4 回答 4

2

那是因为你打scan.nextLine了两次电话

while (!"end".equals(scan.nextLine())){
    url = scan.nextLine();

你应该这样做:

while ( !("end".equals((url = scan.nextLine()))) ) {
    ...
}
于 2013-09-18T19:42:25.350 回答
0

您在每次运行开始时跳过一行。

scan.nextLine()

这会使扫描仪超过返回的行,所以

  while (!"end".equals(scan.nextLine())){
            url = scan.nextLine();

手段url包含第二行。这也意味着它可能会跳过结束条件,导致它试图读取不存在的行。

scan.hasNextLine()是检查您要查找的文件结尾的方法。

于 2013-09-18T19:41:39.367 回答
0

下面的声明

if(!args.equals(null)){

可以切换

if(args.length > 0){

一旦.equals在 String 数组中使用args并不会说明是否包含元素。

于 2013-09-18T19:42:10.120 回答
0

args 永远不会为空(我相信),请尝试 args.length != 0 代替。

于 2013-09-18T19:45:33.610 回答