我有一个java程序,它接受命令行参数,然后将十进制值转换为其对应的十六进制值。我正在尝试使用未触发的异常处理代码块(try/catch)。 try/catch block 旨在在没有命令行参数传递给程序时触发。
通过 Jenkins/SonarQube 运行程序来识别代码异味并修复问题。利用反复试验的过程,尝试不同的可能性,看看是否可以解决设计缺陷。
//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/