繁体   English   中英

Java类设计和处理异常

[英]Java class design and handling Exceptions

我的getChoice()方法从控制台获取一个char输入并将char返回给main() 应该getChoice()只是抛出异常并让main()处理它:

static char getChoice() throws IOException
{
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in));
    return (char)br.read();
}

或者应该getChoice()捕获异常,处理它并返回一个char:

static char getChoice() 
{
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in));
    char temp;
    try {
        temp = (char)br.read();
    } catch(IOException exc) {
        System.out.println("Invalid Input");
        temp = (char)0;
    }
    return temp;
}

从设计角度来看哪种方法更好? 有一个更好的方法吗?

抛出异常似乎对我来说是更好的选择,因为如果发生异常,返回默认值(或错误代码,如果你愿意)不会让调用者知道在读取用户输入时出错。 使用像(char)0这样的返回值作为错误代码可以返回到没有异常处理的语言。

也就是说,你应该考虑捕获IOException并抛出一些你自己的异常,它描述了错误。

例如 :

static char getChoice() throws UserInputException
{
    BufferedReader br = new 
    BufferedReader(new InputStreamReader(System.in));
    char temp = (char)0;
    try {
        temp = (char)br.read();
    }
    catch (IOException ioEx) {
        throw new UserInputException ("Error reading input", ioEx);
    }
    return temp;
}

第一个是更好的方式。 例外意味着发出异常情况。 返回值不是。 在第二个中,调用者必须知道在出现问题时返回0。 而且,0是有效的char值,这使得无法区分“输入是'0'”和“有异常”。

并非使用BufferedReader读取单个char是完全过度的:没有什么可以缓冲的。

这取决于你最喜欢的风格。 在你特别的,非常简单的情况下,我建议第一种方法,即只是抛出异常。

原因如下。 有2种情况:

  1. main确实知道如何处理例外情况(抛出异常或返回非法值)
  2. main与此案无关。

如果main知道如何处理这种情况,2种方法非常相似:

// Catching exception
main(String[] args) {
   try {
       char c = getChoice();
       // do A
   } catch (IOException e) {
      // do B
   }
}


// Returning 0
main(String[] args) {
      char c = getChoice();
      if (c == 0) {
          // do B
      } else {
       // do A
      }
}

但是如果你返回0,你实际上关心的值是两次:第一次进入getChoice() ,第二次进入main() ,在这两种方法之间产生额外的耦合。

然而,即使main()与错误的输入无关。 在这种情况下,您的方法是:

main(String[] args) throws IOException {
     char c = getChoice();
     // do A
}

如您所见,代码更简单。 因此,您的选择取决于您的调用者是否有理由捕获异常的事实。 原因可以是处理它或包装它与其他类型的例外。

应该何时抛出异常? 典型的建议是仅在特殊情况下抛弃它们。 但是什么算是特殊情况? 我建议一个不同的规则(最初由Herb Sutter提出,我相信):当且仅当,替代方案是不能按指定方法执行的操作。 这将问题从模糊(什么是例外)转变为可能精确的东西(规范说的是什么)。

那么你的getChoice方法的规范是什么? 它读了一个选择。 考虑该方法无法读取选择的情况。 该方法不能为该情况return选项,因为它无法读取该选项。 所以它必须抛出异常。 read操作抛出IOExceptiongetChoice方法已尝试但未能读取该选项。 所以它必须抛出异常。 因此,该方法不应该尝试处理IOException本身,而应该让它的调用者处理它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM