如何在 Java 中正确使用 try-catch-finally 块?

How to correctly use try-catch-finally blocks in Java?

使用 finally 块关闭我所在的文件的正确方法是什么:event.dat。如果你能帮助我理解这一点,我将不胜感激。我真的花了 4 个小时来移动东西、玩代码并在线搜索答案,但无济于事。没有那部分代码工作得很好,但我需要知道它在未来的实例中是如何工作的。谢谢你,有一个美好的一天!

我遇到这个块的问题:

          finally{
              fstream.close();        
          } 

位于以下代码中:

    String answer;
    String letter;
    String inType = "";
    double inAmount = 0;
    double amount;

    description();
    GironEventClass newInput = new GironEventClass();
    try{
        File infile = new File("event.dat");
        Scanner fstream = new Scanner(infile);

        System.out.println("File Contents ");

        while(fstream.hasNext())
        {
            inAmount = fstream.nextInt();
            inType = fstream.next();

            try{
                newInput.donations(inType, inAmount);

            }
            catch(IllegalArgumentException a){
                System.out.println("Just caught an illegal argument exception. ");
            }  
           finally{
                   fstream.close();        
          }  
        }

        System.out.println("Total Sales: " + newInput.getSale());
        System.out.println("Donations: " + newInput.getDonated());
        System.out.println("Expenses: " + newInput.getExpenses());



    }

    catch (FileNotFoundException e){
        System.out.println("\nEvent.dat could not be opened. ");
    }

    do{
        System.out.print("Are there any more items to add that were not in the text file? (Type 'Y' or 'N')");
        answer = keyboard.next();
        if (("Y".equals(answer)) || ("y".equals(answer)))
        {
            letter = inLetter();
            amount = inAmount();

            newInput.donations(letter, amount);
        }

    }while (("Y".equals(answer)) || ("y".equals(answer)));

    newInput.display();
}

public static String inLetter(){
    Scanner keyboard = new Scanner(System.in);
    String result;
    String resultTwo;

    System.out.println("T = Tiket Sales");
    System.out.println("D = Donations");
    System.out.println("E = Expenses");
    System.out.print("Please input an identifier ");
    result = keyboard.nextLine();
    resultTwo = result.toUpperCase();

    return resultTwo;    
}

public static double inAmount(){
    Scanner keyboard = new Scanner(System.in);
    double result;

    System.out.println("Please input an amount ");
    result = keyboard.nextInt();

    if(result <= 0.0){
        System.out.print("Please input a positive and non-zero amount ");
        result = keyboard.nextInt();
    }

    return result;
}

public static void description(){
    System.out.println("The program will ask you what amount is being spent on what.");
    System.out.println("    ex: expenses, ticket sales, and profts.");
    System.out.println("This program will help determine whether the event generated or lost money.");      
}

您需要在 try 块之外声明 fstream,否则它将在 finally 块中不可见。

File infile = null;
File infile = null;
try {
    infile = new File("event.dat");
    fstream = new Scanner(infile);

    ...
} catch ( ) {
    ...
} finally {
   // You need to handle exceptions also here
   infile.close();
   fstream.close();
}

您还可以使用新的 try with resources 语法并将流的关闭留给 jvm。

扫描仪应该是这样工作的:

while scanner has object
   read them ( one object per method's call) 
when objects are done
   close the reader.

你的问题是你在while结论为真时使用了close函数。所以你应该把它放在while循环之外

The Try block 尝试做某事。

The Catch block 仅在 Try 块期间出现问题时执行。

The Finally block 每次都在 Try 块(和 Catch 块,如果执行的话)之后执行。

您的问题是您试图在 while 循环内关闭 fstream。

while(fstream.hasNext())  <----- referencing fstream
        {
            inAmount = fstream.nextInt();
            inType = fstream.next();

            try{
                newInput.donations(inType, inAmount);

            }
            catch(IllegalArgumentException a){
                System.out.println("Just caught an illegal argument exception. ");
            }  
           finally{
                   fstream.close();        <---- closing said stream
          }  
        }

因为你已经关闭了流,这个 while 循环应该只执行一次。也就是说,关闭 while 循环外的 fstream,您的程序应该 return 正常。

您也可以将 while 循环移到 try 块中,这也可以。