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);
        }
    }

コードを実行すると、次のエラーが表示されます

「コマンド ラインでファイルを一覧表示するときにプログラムが失敗しました。
スレッド "main" java.util.NoSuchElementException で例外が発生しました: 行が見つかりません」 これは、次の行をスキャンしようとしたときに 15 行目で発生します。

次の行のスキャンを停止するために、私は何を間違っていますか?

4

4 に答える 4

0

各 while-run の開始時に行をスキップしています。

scan.nextLine()

これにより、返されている行を超えてスキャナーが進みます。

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

2行目urlが含まれていることを意味します。これは、終了条件をスキップして、存在しない行を読み取ろうとする可能性があることも意味します。

scan.hasNextLine()探しているファイルの終わりを確認する方法です。

于 2013-09-18T19:41:39.367 に答える
0

args が null になることはありません (私は信じています)。代わりに args.length != 0 を試してください。

于 2013-09-18T19:45:33.610 に答える