0
public static Scanner getFileScanner()
{
    try{
        Scanner input = new Scanner(System.in);
        String file = input.nextLine();
        Scanner fs = new Scanner(new FileReader(file));            
    }catch (FileNotFoundException fe) {
        System.out.println("Invalid filename. Try another:");
        getFileScanner();
    }finally{
        return fs;
    }
}

我不断收到找不到变量 fs 的错误。我无法弄清楚为什么我的生活。

4

6 回答 6

1

让我们首先列出代码中的问题:

  1. return语句上的编译错误是由于fs超出其他答案中所述的范围引起的。

  2. 当您对 进行递归调用时getFileScanner(),您不会分配或返回结果。所以它不会返回给调用者。

  3. returnfinally块中使用 a是个坏主意。它将挤压(丢弃)任何其他可能在那时传播的异常;例如,与 a 不匹配的异常或在块catch中抛出的异常。catch

  4. 如果底层流到达 EOF ,input.nextLine()调用将抛出异常;例如,用户键入 [CONTROL]+D 或其他。您不必抓住它(它未选中),但是finally块中的 return 会挤压它(可能)导致调用者得到 a null。呃...

  5. 硬连线System.in并使System.out您的方法的可重用性降低。(好吧,在这种特殊情况下,这可能不是您应该解决的问题。我不会,在下面......)

  6. 从理论上讲,可以使您的方法抛出StackOverflowError; 例如,如果用户多次点击 [ENTER]。这个问题是您的递归解决方案所固有的,并且是不这样做的一个很好的理由。

最后,这是解决这些问题的方法的一个版本:

public static Scanner getFileScanner() throws NoSuchElementException
{
    Scanner input = new Scanner(System.in);
    while (true) {
        String file = input.nextLine();
        try {
            return new Scanner(new FileReader(file));           
        } catch (FileNotFoundException fe) {
            System.out.println("Invalid filename. Try another:");
        }
    }
}

请注意,我已经替换了递归,摆脱了finally,并声明了抛出的异常。(可以捕获该异常并报告它,或者将其作为特定于应用程序的异常重新抛出。)

于 2011-02-17T03:35:22.587 回答
1

fstry块下声明...要解决此问题,请在块外声明:-

Scanner fs = null;
try {
    ...
    fs = new Scanner(new FileReader(file));
}
catch (FileNotFoundException fe) {
    ...
}
finally {
    return fs;
}
于 2011-02-17T01:02:59.040 回答
1

在块内声明的变量try不在相应finally块内的范围内。一般来说,您的方法存在许多问题......例如,在块return内通常不是一个好主意。finally

这是我要做的:

public static Scanner getFileScanner() {
  Scanner input = new Scanner(System.in);
  File file = null;
  while (true) {
    file = new File(input.nextLine());
    if (file.exists() && file.isFile())
      break;
    System.out.println("Invalid filename. Try another:");
  }
  return new Scanner(new FileReader(file));
}
于 2011-02-17T01:05:50.080 回答
0

您在 try 块中声明了 fs 并尝试在不同的范围(finally 块)中访问它。通常的范例是在 try 块之前将 fs 声明为 null。

于 2011-02-17T01:03:00.487 回答
0

先声明一下:

public static Scanner getFileScanner() {
    Scanner input = new Scanner(System.in);
    Scanner fs = null;
    while(fs == null) {
        try{
            String file = input.nextLine();
            Scanner fs = new Scanner(new File(file));            
        }catch (FileNotFoundException fe) {
            System.out.println("Invalid filename. Try another:");
        }
    }
    return fs;
}
于 2011-02-17T01:01:37.120 回答
0

只是为了扩展其他人用他们的代码示例表示的内容......

因为您fs在块中声明变量,try所以变量只会在try关键字之后的大括号内限定(可见)。

通过将fs变量声明移出 try 块并进入方法体,您可以确保方法体(和块)getFileScanner内的所有块都可以访问该变量。trycatchfinally

希望有帮助!

于 2011-02-17T01:14:37.637 回答