2012-09-26 300 views
3

以下代碼計算存儲在文本文件中的數字的平均值。 我添加了一些「文件未找到」錯誤的異常處理。我需要知道如何在文本文件中的數據不是數字(或不是int)時添加另一個異常。我想增加多個捕獲。不知道如何?Java異常處理?

import java.util.*; 
import java.io.*; 

public class NumAvg2 { 

    public static void main(String[] args) 
    { 
    int c = 1; 
    long sum = 0; 
    String strFileName; 

    strFileName = args[0]; 

    Scanner scFileData; 
    try{ 
     scFileData = new Scanner (new File(strFileName)); 

     while (scFileData.hasNext()) 
     { 
      sum = sum + scFileData.nextInt(); 
      c++; 
     } 

    scFileData.close(); 
    System.out.println("Number of integers: " + (c - 1)); 
    System.out.println("Average = " + (float)sum/(c - 1)); 

    } catch (FileNotFoundException e) { 
     System.out.println("File not found!"); 
     System.exit(1); 
    } 

    } 
} 
+0

您可以讀取一個字符串並嘗試解析。沒有很好的解析能力發現錯誤 – elyashiv

回答

3

注意Scanner.nextInt也會引發InputMismatchException如果下一個標記是不是整數。

docs

拋出: InputMismatchException - 如果下一個標記不匹配整數的正則表達式,或超出範圍

InputMismatchExceptionRuntimeException,所以能在try/catch區塊中被忽略,但您也可以明確處理它:

try 
{ 
    // ... Scanner.nextInt 
} 
catch (FileNotFoundException e) 
{ 
    System.out.println("File not found!"); 
    System.exit(1); 
} 
catch (InputMismatchException e) 
{ 
    // ... not an int 
} 
1

你在哪裏將你的數據從文件轉換爲整數?您應該添加一個的try-catch有..

而不是使用下面的while循環,在那裏你必須趕上例外TypeMismatch的: -

while (scFileData.hasNext()) { 
     try { 
      sum = sum + scFileData.nextInt(); 
      c++; 
     } catch (InputMismatchException e) { 
      System.out.println("Invalid Input"); 
     } 
    } 

您可以使用類似下面的變化: -

while (scFileData.hasNextInt()) 
    { 
     sum = sum + scFileData.nextInt(); 
     c++; 
    } 

scanner.hasNextInt()會自動檢查是否爲整數或不輸入..

而且,您聲明外側y您的變量我們的try-catch塊..我建議不要使用一個大的try-catch塊..

相反,你可以圍繞一個try-catch語句圍繞file reading(這將是一個語句)。然後在幾個語句,您可以再次環繞你左右scanner.nextInt()其他的try-catch ..

所以,我會修改你這樣的代碼: -

public class NumAvg2 { 

public static void main(String[] args) 
{ 
    int c = 1; 
    long sum = 0; 
    String strFileName; 

    strFileName = args[0]; 

    Scanner scFileData; 

    try{ 
     scFileData = new Scanner (new File(strFileName)); 

    } catch (FileNotFoundException e) { 
     System.out.println("File not found!"); 
     System.exit(1); 
    } 
    while (true) { 
     if (scFileData.hasNextInt()) 
     { 
      sum = sum + scFileData.nextInt(); 
      c++; 
      break; 
     } else { 
      System.out.println("Enter an integr"); 
     } 
    } 

    scFileData.close(); 
    System.out.println("Number of integers: " + (c - 1)); 
    System.out.println("Average = " + (float)sum/(c - 1)); 

} 
} 

這樣,你的代碼變得更加清潔.. *只是一個建議..

+0

好的。我也使用這種方法工作。在循環中添加了第二個try/catch,但是您還必須將System.exit(1); –

+0

你現在不需要..看到我用'scanner.hasNextInt()'在同時。它會自動處理它。它只會在裏面,而如果去數是整數.. –

+0

見修改後的代碼..我現在使用了一個'if' ..如果輸入不是整數,則不需要執行'System.exit(1)'。只需要輸入,直到給出整數。 –

2

爲了趕上多個異常,你把它們連像這樣:

public class NumAvg2 { 

public static void main(String[] args) 
{ 
int c = 1; 
long sum = 0; 
String strFileName; 

strFileName = args[0]; 

Scanner scFileData; 
try{ 
    scFileData = new Scanner (new File(strFileName)); 

    while (scFileData.hasNext()) 
    { 
     sum = sum + scFileData.nextInt(); 
     c++; 
    } 

scFileData.close(); 
System.out.println("Number of integers: " + (c - 1)); 
System.out.println("Average = " + (float)sum/(c - 1)); 

} catch (FileNotFoundException e) { 
    System.out.println("File not found!"); 
    System.exit(1); 
} catch(InputMismatchException e){ 
    //handle it 
} 
} 
} 
3
... 
} catch (FileNotFoundException e) { 
    System.out.println("File not found!"); 
    System.exit(1); 
} catch (InputMismatchException e) { 
    // Add stuff into your new exception handling block 
} 
... 

您的IDE可能並沒有抱怨,因爲這是InputMismatchException時一個RuntimeException(未經檢查的異常),而FileNotFoundException異常是一個普通的檢查異常。

+0

}趕上(InputMismatchException時五){ \t //添加的東西到新的異常處理塊 } –

1
} catch (FileNotFoundException | InputMismatchException e) { 
    e.printStackTrace(); 
    System.exit(1); 
} 
6

如果你想

try { 
... 
} 
catch (FileNotFoundException|InputMismatchException ex) { 
//deal with exception 
} 

這比多漁獲清潔了一下,您可以使用Java 7的multi catch。如果拋出這些異常中的任何一個,它將被捕獲到單個catch塊中

+0

這工作:}趕上(FileNotFoundException異常| InputMismatchException時五){ 的System.out.println( 「!出錯」); System.out.println(e.getMessage()); System.exit(1); } –

+0

這是相當... + 1的新功能 –

+0

@FAUZIRASHID當你捕獲異常,從來只打印您自己的消息。總是打印出例外情況。否則,你無法知道實際的錯誤是什麼。 – EJP

3
} catch (InputMismatchException e) { 
    System.out.println("Not integer!"); 
    System.exit(1); 
} catch (FileNotFoundException e) { 
    System.out.println("File not found!"); 
    System.exit(1); 
}