2014-06-25 33 views
-4

这里再重复使用try-catch块是我写的代码和平:在catch块

double value; 
String fileName; 
Scanner readFile; 

Scanner reader=new Scanner(System.in); 
System.out.println("Enter a file name:"); 
fileName=reader.next(); 
reader.close(); 
try{ 
    readFile=new Scanner(new FileReader(fileName)); 
    value=readFile.nextDouble(); 
    readFile.close(); 
} 
catch(FileNotFoundException e){ 
    System.err.println("\n The file doen't exist"); 
} 

然后在catch块我想问用户输入一个有效的文件名无限次直到他进入一个。如果他再次输入无效的文件名称,请使用Try-Catch来引发同样的异常。 我该怎么做?由于

+0

“使用Try-Catch抛出同等的异常”并不完全清楚您的意思。也许你想要一个do/while循环? –

+1

我会去do/while循环。 做{//你的东西} while(value not ok); – Jerome

+1

把它放在无限循环中,如果每个东西在try语句块中最后的语句都应该是System.exit(0); – LMK

回答

1

您在应用程序中缺少循环的概念。

当您的应用程序期望重复某些行为/操作。你应该把它放在一个循环中。有两个循环可用forwhile

for循环用于以前熟知的操作数,并且使用迭代器进行操作。

当您不知道什么时候会发生某些动作并且您只是等待时,会使用while循环。

boolean shouldRetry = true; 

while(shouldRetry) { 

    try { 
     action(); 
     shouldRetry= false; 
     } catch(Exception e) { 
     shouldRetry= true;     
     } 
} 

在你的情况下,do while循环需要,你不知道什么时候用户将提供有效的输入数据。肯定应该至少执行一次操作。

boolean shouldRetry= false; 

do { 

    try { 
    action(); 
    shouldRetry= false; 
    } catch(Exception e) { 
    shouldRetry= true;     
    } 

}while(shouldRetry) 

condition必须是布尔表达式。它的决定应该采取行动。

编辑:

你应该尝试的动作在你的代码中分离出来,如果可能的分离方法。

 Scanner reader = new Scanner(System.in); 

     do { 
      System.out.println("Enter a file name:"); 
     } while(!processFile(reader.next())); //Read the file name 

     reader.close(); 


    /** 
    * @return true if file read with success otherwise false. 
    */ 
    private boolean processFile(String fileName) { 

     try { 
      //read the file 
     }catch(Exception e) { 
      return false; 
     } 
     return true; 

    } 

这给你更灵活的行为。有了这个,你可以在文件无效时重试,因为它不存在,但也可能是因为它没有你期望的值。

+0

哦,真的!对不起。 – Unihedron

+0

没问题。 )。 –

+0

感谢您的帮助。我认为循环会进入catch块。这是我的疑问。 –

4
  • 首先,重用Scanner(不要关闭它马上 - 但接近 它时,它的时间)。
  • 然后,使用一个无限循环(即while (true))来检查该用户输入无限期
  • 然后,初始化一个新的File(在循环之前声明它,在循环内将其初始化)与给定String,并检查:
    • 它是否存在
    • 无论你的程序有适当的访问权限(见FileAPI
  • 如果是这样,使用break声明退出循环

一旦你有你File,你可以关闭Scanner(或重用别的东西)。

您可能还想让用户输入“quit”命令退出循环而不继续,并通知用户文件是否存在/不可访问。

+0

为什么使用无限循环而不是'while(!(file = new File(reader.next()).exists()))?对于这种情况,代码检查抽象文件名的存在而不是捕获异常会更稳定。 – Unihedron

+0

@Unihedron好点。让我编辑我的答案...... – Mena