0

このコードの if ステートメントは、何をしても常に true を返します。プログラムに引数を与えなくてもnullPointerException、if ステートメントが true を返したことを示す が返されます。手伝って頂けますか?

import java.io.*;
import java.util.*;

public class Oblig4 {
    static Menu menu = new Menu();
public static void main(String[] args) {
    if(args[0].matches("^[a-zA-Z0-9]{1,40}\\\\.txt$") && args[1].matches("^[a-zA-Z0-9]{1,40}\\\\.txt$")){
        menu.menu(args[0], args[1]);
    }
    else{
        System.out.println("You have not given the correct arguments.");
    }
  }

}
4

2 に答える 2

0

プログラムに引数を与えなくても、if ステートメントが true を返したことを示す nullPointerException が発生します。

これは、NPE をスローする場合に true になることを示しているわけではありません。最初にandをチェックしnullてから、次を含むステートメントに進む必要があります。args[0]args[1]ifmatches

于 2012-11-02T11:01:25.957 に答える
0

JSAPライブラリを使用して引数を解析する際の問題を回避できます。それがどれほど簡単か見てみましょう:

import java.io.File;
import java.util.regex.Pattern;

import com.martiansoftware.jsap.FlaggedOption;
import com.martiansoftware.jsap.JSAP;
import com.martiansoftware.jsap.JSAPException;
import com.martiansoftware.jsap.JSAPResult;
import com.martiansoftware.jsap.stringparsers.FileStringParser;

public class Oblig4 {

    private Pattern fileNamesPattern = Pattern
            .compile("^[a-zA-Z0-9]{1,40}\\.txt$");
    private JSAP jsap = new JSAP();

    public static void main(String[] args) throws JSAPException {
        Oblig4 oblig4 = new Oblig4();
        oblig4.init();
        JSAPResult config = oblig4.jsap.parse(args);
        if (!config.success()) {
            System.err.println();
            System.err.println("Usage: ");
            System.err.println("java -jar jar_file_name.jar "
                    + oblig4.jsap.getUsage());
            System.err.println(oblig4.jsap.getHelp());
            System.err.println();
            return;
        }
        File firstFile = config.getFile("firstFile");
        File secondFile = config.getFile("secondFile");
        if (!oblig4.fileNamesIsValid(firstFile, secondFile)) {
            System.out.println("File names is not valid. See pattern "
                    + oblig4.fileNamesPattern.pattern());
        }
        Menu menu = new Menu();
        menu.doSomething(firstFile, secondFile);
    }

    private void init() throws JSAPException {
        FileStringParser fileStringParser = FileStringParser.getParser();
        fileStringParser.setMustBeDirectory(false);
        fileStringParser.setMustBeFile(true);
        fileStringParser.setMustExist(false);
        FlaggedOption firstInputFile = new FlaggedOption("firstFile")
                .setStringParser(fileStringParser).setRequired(true)
                .setShortFlag('f');
        firstInputFile.setHelp("First text file");
        jsap.registerParameter(firstInputFile);

        FlaggedOption secondInputFile = new FlaggedOption("secondFile")
                .setStringParser(fileStringParser).setRequired(true)
                .setShortFlag('s');
        secondInputFile.setHelp("Second text file");
        jsap.registerParameter(secondInputFile);
    }

    private boolean fileNamesIsValid(File... files) {
        for (File file : files) {
            if (!fileNamesPattern.matcher(file.getName()).find()) {
                return false;
            }
        }
        return true;
    }
}

class Menu {
    public void doSomething(File firstFile, File secondFile) {

    }
}

引数がない場合、または引数が有効でない場合、ユーザーには次のように表示されます。

Usage: 
java -jar jar_file_name.jar -f <firstFile> -s <secondFile>
  -f <firstFile>
        First text file

  -s <secondFile>
        Second text file
于 2012-11-02T11:30:52.763 に答える