【发布时间】:2020-07-18 06:25:32
【问题描述】:
@Parameters(index = "0")
private Double min_c_re;
@Parameters(index = "1")
private Double min_c_im;
@Parameters(index = "2")
private Double max_c_re;
@Parameters(index = "3")
private Double max_c_im;
@Parameters(index = "4")
private Integer max_n;
@Parameters(index = "5")
private Integer width;
@Parameters(index = "6")
private Integer height;
@Parameters(index = "7")
private Integer divisions;
@Parameters(index = "8", arity = "1..*")
private List<URL> hosts;
@Override
public void run() {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
List<SubDivider.SubDivision> subDividedImages = new SubDivider(divisions, divisions).divide(image);
ExecutorService threadPool = Executors.newCachedThreadPool();
double realRange = max_c_re - min_c_re;
double imaginaryRange = max_c_im - min_c_im;
for (int i = 0; i < subDividedImages.size(); i++) {
SubDivider.SubDivision subDivision = subDividedImages.get(i);
BufferedImage subDividedImage = subDivision.getImage();
URL host = hosts.get(i % hosts.size());
double xPercent = subDivision.getOriginalMinX() / (double) width;
double yPercent = subDivision.getOriginalMinY() / (double) height;
double widthPercent = subDividedImage.getWidth() / (double) width;
double heightPercent = subDividedImage.getHeight() / (double) height;
String resource = new StringJoiner("/")
.add("/mandelbrot")
.add(Double.toString(min_c_re + realRange * xPercent))
.add(Double.toString(min_c_im + imaginaryRange * yPercent))
.add(Double.toString(min_c_re + realRange * xPercent + realRange * widthPercent))
.add(Double.toString(min_c_im + imaginaryRange * yPercent + imaginaryRange * heightPercent))
.add(Integer.toString(subDividedImage.getWidth()))
.add(Integer.toString(subDividedImage.getHeight()))
.add(Integer.toString(max_n))
.toString();
URL url;
try {
url = new URL(host, resource);
} catch (MalformedURLException exception) {
System.err.println("Exception: " +
exception.getMessage());
return;
}
threadPool.submit(new SubDivisionGenerator(url, subDividedImage));
}
try {
threadPool.shutdown();
threadPool.awaitTermination(1, TimeUnit.HOURS);
} catch (InterruptedException exception) {
System.err.println("Exception: "
+ exception.getMessage());
return;
}
File file = new File("output.pgm");
HashMap<String, Object> params = new HashMap<>();
try {
Imaging.writeImage(image, file, ImageFormats.PGM, params);
} catch (ImageWriteException | IOException exception) {
System.err.println("Exception: "
+ exception.getMessage());
return;
}
}
当我运行命令java -jar target/cli-1.0.0.jar -1 -1.5 2 1.5 1024 10000 10000 4 http://localhost:8080
我得到了这个例外:
Could not convert 'https://localhost:8080' to Integer for positional parameter at index 6 (<height>): java.lang.NumberFormatException: For input string: "https://localhost:8080"
使用picocli 2.3.0版本
【问题讨论】:
-
Mixage,有什么理由继续使用这个非常旧的 picocli 版本吗?最新版本有许多错误修复和新功能。 (仅供参考,升级不会帮助解决您提出的问题;我建议 Per Huss 的回答是使用
setUnmatchedOptionsArePositionalParams告诉 picocli 解析器如何处理 unmatched options。) -
仅供参考,我在 picocli 4.3 的路线图中添加了 showing the
--end-of-options delimiter in the usage help message。我确实喜欢@per-huss 的建议使用setUnmatchedOptionsArePositionalParams,因为它不依赖于最终用户对--end-of-options 分隔符的理解;这意味着您的应用程序将对大多数用户“正常工作”。
标签: java command-line picocli