0

我试图s.next()在 try-catch 块之后声明,但它不起作用!只有在 try 块内s时才会有下拉菜单。

我不想集中解析输入,在 try 块中采取适当的操作,因为它们不会抛出 FNFE 和 IOE。我可以在这里做什么?

public static void main(String[] args) 
      {
        // TODO Auto-generated method stub

        //Open file; file name specified in args (command line)
        try{
            FileReader freader = new FileReader(args[0]);
            Scanner s = new Scanner(freader);

        }catch(FileNotFoundException e){
            System.err.println("Error: File not found. Exiting program...");
            e.printStackTrace();
            System.exit(-1);
        }catch(IOException e){
            System.err.println ("Error: IO exception. Exiting...");
            e.printStackTrace();
            System.exit(-1);
        }
        // if i try to declare s.next() here it would not work
4

3 回答 3

2

我认为您的意思是您想使用s.next() 并且它不起作用。

为此,将 s 声明为 try/catch 块之外的变量,并在此处将其设置为 null。然后将其分配到您现在分配的位置,但没有声明。如果我的假设是正确的,那么您的问题是 s 不再是 try/catch 之外的活动变量,因为它是在该块中声明的。

FileReader freader = null;
Scanner    s       = null;
try { freader = new FileReader(args[0]); // risk null pointer exception here
      s = new Scanner(freader);
    }
catch { // etc.
于 2012-11-22T02:34:18.680 回答
1

因为作为类s实例的变量Scanner仅限于try块。如果您想在块s访问,请在 try catch 之外声明它。try-catch

 Scanner s = null;
 try{
        FileReader freader = new FileReader(args[0]);
         s = new Scanner(freader);

    }catch(FileNotFoundException e){
        System.err.println("Error: File not found. Exiting program...");
        e.printStackTrace();
        System.exit(-1);
    }catch(IOException e){
        System.err.println ("Error: IO exception. Exiting...");
        e.printStackTrace();
        System.exit(-1);
    }
于 2012-11-22T02:34:48.087 回答
1

在 Java 中,变量由它们声明的块限定。由于您的 Scanner 是在块内构造的try,因此在块外是不可见的。

您是否有任何理由要在此块之外进行实际扫描操作?在 Java 7 中,一个常见的习惯用法是try-with-resources模式:

try (Scanner s = new Scanner(new FileInputStream(file)) {
  //Do stuff...
}

这将自动关闭扫描仪资源。实际上,您可能会泄漏它,因为finally您的代码示例中没有任何块。

于 2012-11-22T02:45:14.197 回答