Java代码不读取参数

时间:2013-09-18 19:34:20

标签: java arguments

对于我所拥有的类,我必须接受参数,这些参数将是每行上具有不同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行。

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

4 个答案:

答案 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。