java - 程序中未触发异常处理/意外行为

标签 java exception arguments

我有一个java程序,它接受命令行参数,然后将十进制值转换为其对应的十六进制值。我正在尝试使用未触发的异常处理代码块(try/catch)。 try/catch block 旨在在没有命令行参数传递给程序时触发。

通过 Jenkins/SonarQube 运行程序来识别代码异味并修复问题。利用反复试验的过程,尝试不同的可能性,看看是否可以解决设计缺陷。

https://pastebin.com/frBq46zs

//import java.util.Scanner;
public class Dec2Hex
{
public static int Arg1;

public static void main(String args[])
{
Scanner scan = new Scanner(System.in);
System.out.println("Enter any number: ");
//Arg1= scan.nextInt();
//scan.close();
if (args.length < 0)
{
try
{
Arg1 = Integer.parseInt(args[0]);
}
catch (NumberFormatException e)
{
System.err.println("Argument" + args[0] + " must be an integer.");
System.exit(1);
}
}

利用 if (args.length > 0)没有命令行值会导致异常不被触发。我认为这是可以预料的,因为条件语句没有得到满足,异常 block 永远不会被触发。

然而,事实并非如此。我想如果(args.length==0)那么这意味着“没有传递任何参数,尝试解析在命令行输入的值。如果仍然无法解析任何值,则触发 catch 语句生成错误消息并将其输出给用户。 ”

每当我使用args.length==0时或args.length<0如果没有提交命令行参数,我得到的只是:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

消息具体指以下代码行:

Arg1 = Integer.parseInt(args[0]);

最佳答案

在您的代码中Arg1 = Integer.parseInt(args[0]);在方法调用之前 Integer.parseInt方法参数将得到解决。因此它将尝试从参数列表中获取第一个元素(因为 Java 数组是基于 0 的,它将获取索引为 0 的第一个元素)。

由于您没有传递任何命令行参数,因此代码在参数解析过程中被破坏。因为数组长度为0,args[0]正在给予ArrayIndexOutOfBoundsException 。这是预期的情况。所以你也应该处理这个异常。

try
{
Arg1 = Integer.parseInt(args[0]);
}
catch (ArrayIndexOutOfBoundsException e)
{
System.err.println("No Argument Provided.");
System.exit(1);
}
catch (NumberFormatException e)
{
System.err.println("Argument" + args[0] + " must be an integer.");
System.exit(1);
}

如果你想执行0长度的异常代码,你不需要检查参数长度的if条件。如果要执行现有异常 block ,请传递非数字参数并删除 if 条件。

总而言之,代码将达到 NumberFormatException当您传递一些参数并且该参数不是数字时会阻塞。 Integer.parseInt 将抛出该异常。当前异常由 args[0] 引发因为数组长度为 0 并且您尝试从空数组中检索第一个数组元素,并且它抛出 ArrayIndexOutOfBoundsException .

虽然不希望到达异常代码,但您甚至可以在此之前处理它。

关于java - 程序中未触发异常处理/意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58746170/

相关文章:

java - 输入不匹配异常错误

javascript - 在这里使用回调函数(JavaScript)有什么好处吗?

java - 在 Java Spring Boot 中运行时更改 @Bean 的值

java - 合并社区并找到最大社区的规模

java - 如何使用 xml 或 java 设置 gridview 单元格的背景颜色,但它不是自定义的

c++ - 如何在 Windows 上报告堆栈缓冲区溢出?

java - AudioSystem.getInputStream(InputStream) 异常

c++ - 捕获 boost 序列化存档异常

接受参数与输入的 Python 函数

python - 检查函数参数的最佳方法?