【问题标题】:How to write a method header that throws exception如何编写抛出异常的方法头
【发布时间】:2015-03-06 13:06:47
【问题描述】:

"鉴于 FileInputStream 的构造函数抛出 FileNotFoundException,它是 例外,为一个名为 process 的公共方法编写标头,该方法采用 String 参数 并且什么都不返回,其主体实例化了一个 FileInputStream 对象并且不包含 一个 try-catch 语句。”

我知道这是一个过于简单的问题,但我想确保我不会以愚蠢的方式搞砸。另外,不确定是使用 FileNotFoundException 还是只使用 Exception 或 IO 等。

public process(String file) throws FileNotFoundException {

    FileInputStream file = new FileInputStream("stuff.txt");
}

【问题讨论】:

    标签: java exception methods filenotfoundexception fileinputstream


    【解决方案1】:

    throws 子句的内容很好。抛出 IOException 并不可怕,但最好具体一点。调用代码仍然可以将其视为 IOException。

    除了特殊情况(Junit 方法和抛出的所有东西都会被异常处理程序捕获的类似情况),通常你不应该抛出异常,因为它会强制所有调用它的东西进入处理异常的位置(它可能不是合适的地方,最好让大多数异常冒泡到一个可以统一处理的地方)或者抛出异常,然后将其他调用方法放在同一位置。

    您的方法声明无效,因为没有返回类型。不返回任何内容的方法声明为返回类型为 void。

    对方法参数使用与局部变量相同的名称是行不通的,您应该使它们不同。构造函数调用应该将方法参数作为参数(而不是硬编码字符串文字)。 (+1 到 geceo's answer 指出那个,我错过了那个。)

    建议您的代码使用反映变量内容的名称会更清晰。调用 FileInputStream file 不清楚,最好叫它inputStream。调用字符串file不清楚,最好叫filename

    【讨论】:

      【解决方案2】:

      您所拥有的一切都很好(除非您缺少 void 返回类型)。

      始终抛出(并捕获)Exception 的最窄规范(在本例中为 FileNotFoundException)。

      【讨论】:

        【解决方案3】:

        正如 Nathan 所发现的,您忘记声明 process 什么也不返回,也就是说,您忘记了 void 关键字。

        您的参数String file(“重复的局部变量文件”)还有另一个问题。您应该将其重命名为String filename 并将其传递给FileInputStream 的构造函数:

        public void process(String filename) throws FileNotFoundException {
            FileInputStream file = new FileInputStream(filename);
        }
        

        关于一般主题,当您调用抛出异常的方法时,您总是必须做出选择:

        • 您可以使用 try/catch 块并处理调用方法中的错误(例如记录错误);

        • 您可以在方法声明中使用 throws 关键字传播异常。

        所以你在这里做的是第二种可能性。

        【讨论】:

        • 很好,我错过了关于方法参数和局部变量名称的部分。
        • 我错过了“空白”。 :)
        【解决方案4】:

        还添加void 作为返回类型。 休息很好。

        public void process(String file) throws FileNotFoundException {
        
            FileInputStream file = new FileInputStream("stuff.txt");
        }
        

        【讨论】:

          【解决方案5】:

          您可以通过购买意外误用保险来改善您的方法:

          public void process(final String file) throws FileNotFoundException {
          
              final FileInputStream inputStream = new FileInputStream("stuff.txt");
              //invoke operations on inputStream object
              //After 100 lines of code
              inputStream = new FileInputStream("foo.txt"); // compile error
          }
          

          注意传递给方法和 FileInputStream 对象引用的参数旁边的 final 关键字。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-16
            • 2017-08-06
            • 2014-10-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多