【问题标题】:Java Exception Handling?Java 异常处理?
【发布时间】:2012-09-26 19:15:52
【问题描述】:

以下代码计算存储在文本文件中的数字的平均值。 我为“找不到文件”错误添加了一些异常处理。当文本文件中的数据不是数字(或不是 int)时,我需要知道如何添加另一个例外。我考虑过添加多个捕获。不知道怎么做?

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

public class NumAvg2 {

    public static void main(String[] args)
    {
    int c = 1;  
    long sum = 0;
    String strFileName;

    strFileName = args[0];

    Scanner scFileData;
    try{
        scFileData = new Scanner (new File(strFileName));

        while (scFileData.hasNext())
        {
            sum = sum + scFileData.nextInt();
            c++;
        }

    scFileData.close();
    System.out.println("Number of integers: " + (c - 1)); 
    System.out.println( "Average = " + (float)sum/(c - 1));

    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
        System.exit(1);
    }

  } 
}   

【问题讨论】:

  • 你可以读取一个字符串并尝试解析。不好解析好光线一个错误

标签: java exception exception-handling try-catch


【解决方案1】:

如果需要,您可以使用 Java 7 的 multi catch

try {
...
}
catch (FileNotFoundException|InputMismatchException ex) {
//deal with exception
}

这比多次捕获要干净一些。如果抛出这些异常中的任何一个,它将被捕获在单个 catch 块中

【讨论】:

  • 这有效: } catch (FileNotFoundException|InputMismatchException e) { System.out.println("发生错误!"); System.out.println(e.getMessage()); System.exit(1); }
  • 这很漂亮...+1 新功能
  • @FAUZIRASHID 当你捕捉到异常时,永远不要只打印你自己的消息。始终打印带有异常的那个。否则你就没有希望知道实际的错误是什么。
  • @FAUZIRASHID,EJP 提出了一个很好的观点。此外,如果它有效,那么接受答案是一种很好的礼仪......
【解决方案2】:
} catch (InputMismatchException e) {
    System.out.println("Not integer!");
    System.exit(1);
} catch (FileNotFoundException e) {
    System.out.println("File not found!");
    System.exit(1);
}

【讨论】:

    【解决方案3】:
    ...
    } catch (FileNotFoundException e) {
        System.out.println("File not found!");
        System.exit(1);
    } catch (InputMismatchException e) {
        // Add stuff into your new exception handling block
    }
    ...
    

    您的 IDE 可能没有对此抱怨,因为 InputMismatchException 是 RuntimeException(未经检查的异常),而 FileNotFoundException 是常规检查的异常。

    【讨论】:

    • } catch (InputMismatchException e) { // 将内容添加到新的异常处理块中 }
    【解决方案4】:

    请注意,如果下一个标记不是整数,Scanner.nextInt 也会抛出 InputMismatchException

    来自docs

    抛出: InputMismatchException - 如果下一个标记与 Integer 正则表达式不匹配,或者超出范围

    InputMismatchExceptionRuntimeException,因此可以在 try/catch 块中忽略,但您也可以显式处理它:

    try
    {
        // ... Scanner.nextInt
    }
    catch (FileNotFoundException e)
    {
        System.out.println("File not found!");
        System.exit(1);
    }
    catch (InputMismatchException e)
    {
        // ... not an int
    }
    

    【讨论】:

      【解决方案5】:

      要捕获多个异常,您可以像这样链接它们:

      public class NumAvg2 {
      
      public static void main(String[] args)
      {
      int c = 1;  
      long sum = 0;
      String strFileName;
      
      strFileName = args[0];
      
      Scanner scFileData;
      try{
          scFileData = new Scanner (new File(strFileName));
      
          while (scFileData.hasNext())
          {
              sum = sum + scFileData.nextInt();
              c++;
          }
      
      scFileData.close();
      System.out.println("Number of integers: " + (c - 1)); 
      System.out.println( "Average = " + (float)sum/(c - 1));
      
      } catch (FileNotFoundException e) {
          System.out.println("File not found!");
          System.exit(1);
      } catch(InputMismatchException e){
          //handle it
      }
      } 
      }
      

      【讨论】:

        【解决方案6】:
        } catch (FileNotFoundException | InputMismatchException e) {
            e.printStackTrace();
            System.exit(1);
        }
        

        【讨论】:

          【解决方案7】:

          您在哪里将数据从文件转换为整数?你应该在那里添加一个try-catch..

          而不是使用下面的 while 循环,您必须在其中捕获 TypeMismatch 的异常:-

              while (scFileData.hasNext()) {
                  try {
                      sum = sum + scFileData.nextInt();
                      c++;
                  } catch (InputMismatchException e) {
                      System.out.println("Invalid Input");
                  }
              }
          

          您可以使用如下变体:-

              while (scFileData.hasNextInt())
              {
                  sum = sum + scFileData.nextInt();
                   c++;
              }
          

          scanner.hasNextInt() 会自动检查输入是否为整数..

          另外,由于您在 try-catch 块之外声明变量。我建议不要使用大的 try-catch 块..

          您可以将file reading 语句包围在一个try-catch 周围(这将是一个语句)。然后在几个语句之后,您可以再次将您的scanner.nextInt() 包围在另一个try-catch 周围..

          所以,我会像这样修改你的代码:-

          public class NumAvg2 {
          
          public static void main(String[] args)
          {
              int c = 1;  
              long sum = 0;
              String strFileName;
          
              strFileName = args[0];
          
              Scanner scFileData;
          
              try{
                  scFileData = new Scanner (new File(strFileName));
          
              } catch (FileNotFoundException e) {
                  System.out.println("File not found!");
                  System.exit(1);
              }
              while (true) {
                  if (scFileData.hasNextInt())
                  {
                      sum = sum + scFileData.nextInt();
                      c++;
                      break;
                  } else {
                      System.out.println("Enter an integr");
                  }
              }
          
              scFileData.close();
              System.out.println("Number of integers: " + (c - 1)); 
              System.out.println( "Average = " + (float)sum/(c - 1));
          
          }
          }
          

          这样你的代码会变得更干净.. * 只是一个建议..

          【讨论】:

          • 好的。我也用这种方法让它工作。在循环中添加了第二个 try/catch,但您还必须放置一个 System.exit(1);
          • 你现在不需要了..看到我在while中使用了scanner.hasNextInt()..它会自动处理它..它只会在数字是整数时进入while..
          • 查看修改后的代码。我现在使用了if。如果输入不是整数,你不需要做System.exit(1)。只要请求输入,直到给出整数。 .
          • 有趣的做法。谢谢!
          猜你喜欢
          • 2013-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-03
          • 2020-12-09
          • 1970-01-01
          相关资源
          最近更新 更多