如何返回fileinputstream??在java中

y3bcpkx1  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(320)

这个问题在这里已经有答案了

java返回值(在try/catch子句中)(6个答案)
上个月关门了。

package asasaSASA;

import java.io.*;

class FileInputTest {
    public static FileInputStream f1(String fileName) {
        try {
            FileInputStream fis = new FileInputStream(fileName);
            System.out.println("f1: File input stream created");
            return fis; // I HAVE RETURN fis
        }
        catch (FileNotFoundException e) {
            System.out.println("에러는"+e);
        }
    }

    public static void main(String args[]) {
        FileInputStream fis1 = null;
        String fileName = "foo.bar";
        System.out.println("main: Starting " + FileInputTest.class.getName()
                                                   + " with file name = " + fileName);
        fis1 = f1(fileName);
        System.out.println("main: " + FileInputTest.class.getName() + " ended");
    }
}

我想让这个代码运行,但它说
此方法必须返回fileinputstream类型的结果
我不明白,因为我回来了 fis . 为什么上面说你必须回去?我已经退了!

vof42yt1

vof42yt11#

异常处理就是问题所在。这是一种常见但糟糕的代码风格:每当您捕获到异常时,正确的做法是要么处理该异常,要么确保您(重新)抛出某个异常。
记录下来,还是打印出来?这不是在处理异常。
在这种情况下,“找不到文件”不是您需要处理的;除非你详细说明什么 f1 应该这样做(提示:方法应该更具描述性)。因此,扔东西是公平的游戏。此外,定义 f1 (大概是;这个名字并不特别有启发性,而且这个方法没有文档)表明“打开这个文件”是它的一个基本方面,因此,抛出一个 FileNotFoundException 也是公平的。
因此:

最佳解决方案

public static FileInputStream f1(String fileName) throws IOException {
 FileInputStream fis = new FileInputStream(fileName);
 System.out.println("f1: File input stream created");
 return fis;
}

public static void main(String[] args) throws Exception {
String fileName = "foo.bar";
 System.out.println("main: Starting " + FileInputTest.class.getName()
 + " with file name = " + fileName);
 try (InputStream in = f1(fileName)) {
    // you must close any resources you open using a try-with-resources
    // construct; you did not do that in your code, I fixed this.
 }
}

注:你的psv主可以(通常应该!)宣布 throws Exception .

交替拍摄

这一点在任何你不能做到的情况下都适用 throws 异常,或者如果添加签名没有意义,因为它反映了实现细节,而不是方法尝试执行的固有方面:

public static FileInputStream f1(String fileName) {
 try {
   FileInputStream fis = new FileInputStream(fileName);
   System.out.println("f1: File input stream created");
   return fis;
 } catch (IOException e) {
   throw new RuntimeException("Unhandled", e);
 }
}

当然,这只适用于在正常情况下确实不希望出现异常的情况。否则,要么向前抛出该异常,要么创建自己的异常类型并抛出该异常,而不是 RuntimeException .
如果你只是需要一个¯(ツ)/¯ 我真的不知道这意味着什么,我只想继续,摆脱这些异常解决方案: throw new RuntimeException("Uncaught", e); 是正确的; e.printStackTrace(); 不正确。更新ide的模板。

2hh7jdfx

2hh7jdfx2#

您的方法抛出一个选中的异常,该异常必须在方法内部或外部处理。选中的异常表示可能发生问题,您需要实现一些东西来处理此场景。这里我们担心文件不存在。
您有三个选择:
为不存在的文件返回和处理值(此处不引发异常)。所以要么返回null,然后签入 main() inputstream不为null,或者返回可选的<>,这是处理此类场景的jdk8方法。
例子:

public static FileInputStream f1(String fileName) {
  try {
    FileInputStream fis = new FileInputStream(fileName);
    System.out.println("f1: File input stream created");
    return fis;
  } catch(FileNotFoundException e) {
     System.out.println("Error "+e);
     return null; // in case of not existing file
  }
 }

将选中的filenotfoundexception Package 到自定义runtimeexception中。这将解决您的编译错误问题,但如果您在某个地方无法捕获此异常,则将来可能会出现问题。
例子:

public static FileInputStream f1(String fileName) {
  try {
    FileInputStream fis = new FileInputStream(fileName);
    System.out.println("f1: File input stream created");
    return fis;
  } catch(FileNotFoundException e) {
     System.out.println("Error "+e);
     throw new RuntimeException(e);
  }
 }

将此异常添加到方法签名,而不是try catch:
例子:

public static FileInputStream f1(String fileName) throws FileNotFoundException{
    FileInputStream fis = new FileInputStream(fileName);
    System.out.println("f1: File input stream created");
    return fis;

 }

但是如果您在某个时候在方法中声明了一个选中的异常,您将不得不捕获它并处理它。
方案3是最理想的。

neekobn8

neekobn83#

FileInputStream fis = new FileInputStream(fileName);

如果上面的线抛出 FileNotFoundException 接下来要执行的代码行是

System.out.println("에러는"+e);

也就是说它绕过了你的 return 语句,这就是为什么会出现编译器错误。
有许多不同的方法来修复编译器错误,其他答案解释了不同的方法。我只是回答你的问题,即
为什么上面说你必须回去?
我希望你现在明白为什么你说的是错的
我已经退了!

相关问题