【问题标题】:A few problems with java input exception handlingjava输入异常处理的几个问题
【发布时间】:2017-12-08 19:09:27
【问题描述】:

我需要处理空输入并从输出中删除堆栈跟踪。

这是我的代码的 sn-p:

public class TestShape
{
    public static void main(String args[])
    {

        for(int i = 0; i < args.length; i++)
        {
            try
            {
                Integer.parseInt(args[i]);
            }

            catch(NumberFormatException nfe)
            {
                System.err.println("\n" + "NumberFormatException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");
            }

            if (args.length==0 ||args.length>3||Integer.parseInt(args[i])<0) 
                throw new IllegalArgumentException("\n" + "IllegalArgumentException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");
        }

我有两个问题,首先是当用户在命令行上没有输入值时,它应该抛出 IllegalArguementException 和相应的错误消息。当我运行此代码并且不输入任何值时,它会运行而不会引发异常。它看起来像这样:

C:\Users\XXX\Desktop\Folder>java TestShape

C:\Users\XXX\Desktop\Folder>_

第二个问题是当我尝试其他异常(使用字符串而不是 int、负数、超过 3 个数字等)时,它会输出正确的消息,但也会打印出堆栈跟踪:

C:\Users\Chef Boi Logro\Desktop\Folder\ICS 112\Lab 练习\LE8\New>java TestShape -1 2 -3

线程“主”java.lang.IllegalArgumentException 中的异常:

IllegalArgumentException 被捕获 请输入 1、2 或 3 有效 仅限数字 在 TestShape.main(TestShape.java:19)

我需要的是终端只显示错误消息,没有堆栈跟踪。

【问题讨论】:

  • 我相信您的程序的第一个参数是程序本身的名称。您是否尝试过在代码中打印 arg[0] 并在没有参数的情况下运行?
  • @Nathan 在此处检查接受的答案:stackoverflow.com/questions/24339479/… 如果未输入任何参数,则 args 的长度可以为 0
  • @ArvindSasikumar 确实,我误认为C args ^^ 这与问题无关,因为args.length == 0 时甚至没有进入循环。
  • 是的,Eran 的回答是对的。

标签: java exception-handling


【解决方案1】:

没有提供参数时不会进入你的循环,因此不会抛出异常,也不会显示任何内容。

如果args.length==0,您应该在引发异常的循环之前添加一个条件。

至于显示的堆栈跟踪,这是main 方法未处理的异常的默认行为。为了避免这种情况,您必须捕获所有抛出的异常。

也许你应该替换

throw new IllegalArgumentException("\n" + "IllegalArgumentException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");

System.err.println("\n" + "Please input 1, 2 or 3 valid numbers only");

因为从main 方法抛出异常没有多大意义(因为没有其他方法可以处理此类异常)。

这是一个建议的方法:

public static void main(String args[])
{
    if (args.length == 0 || args.length > 3) {
        System.err.println("Please input 1, 2 or 3 valid numbers only");
    } else {
        for(int i = 0; i < args.length; i++) {
            try {
                if (Integer.parseInt(args[i]) < 0) {
                    System.err.println("\n" + "Please input 1, 2 or 3 valid numbers only");
                }
            }
            catch(NumberFormatException nfe) {
                System.err.println("\n" + "NumberFormatException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");
            }
        }
    }
}

【讨论】:

  • 如何捕获这些异常?也是 try-catch 方法中的一个,NumberFormatException 也显示堆栈跟踪
  • @salmonade 不要抛出异常。 NumberFormatException 会显示堆栈跟踪,因为它被抛出了两次,因为您调用了两次 Integer.parseInt(args[i]),并且只捕获了一次。
【解决方案2】:

对于第一个问题,您在错误的地方检查条件。请参阅给定的代码进行更正。 对于第二个问题,您正在使用显示堆栈跟踪的默认异常处理。对于自定义错误处理,请使用 throws 子句。参考给定的代码。

更新代码:

if (args.length < 1)
{
    throw new IllegalArgumentException("\n" + "IllegalArgumentException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");
}
else
{
    for(int i = 0; i < args.length; i++)
    {
        if (args[i].matches("[0-9]+") && args[i].length() <= 3)
            {
                Integer.parseInt(args[i]);
            }
            else
            {
                throw new NumberFormatException("NumberFormatException is caught" + "\n" + "Please input 1, 2 or 3 valid numbers only");
            }
    }
}

希望这会有所帮助。 :-)

【讨论】:

  • NumberFormatException 仍然给我一个堆栈跟踪:/
  • 如果您觉得有用,请将其标记为答案。谢谢:-)
【解决方案3】:

您可以在检查避免异常之前检查收到的值,因为您有任务的预期数字(从 0 到 9);

我更喜欢这种方法:

    public static void main(String args[])
    {
      if(arargs.length < 1 || arargs.length > 3) //firstly check input size
      {
        System.out.println("Please input 1, 2 or 3 valid numbers only.");
        return;
      }
      List<String> allowedNumbers = Arrays.asList("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"); //define allowed numbers (please move to constant in your class for avoid multimple initialization)
        for(int i = 0; i < args.length; i++)
        {
          try
          {
            if(allowedNumbers.contains(args[i]))
            {
              Integer.parseInt(args[i]); //now it's safety parse without exceptions
            } 
          }
          catch(NumberFormatException nfe)
          {
            System.err.println(nfe.toString());
          }
        }
      }

希望它是有用的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 2016-02-16
    • 2016-06-27
    相关资源
    最近更新 更多