簡體   English   中英

未報告的異常Java

[英]Unreported exception java

我收到了一個未報告的異常; 必須在下面的fill方法中被捕獲或聲明為拋出錯誤。 從我讀過的類似文章中,我認為錯誤是由read方法引發Exception引起的,但我無法修復。

public void read(int fileName)  throws Exception 
{
    FileInputStream in = null;

    try 
    {
        Scanner in = new Scanner("dataset.txt");
        File inFile = new File(in.nextLine());
        in = new FileInputStream(inFile);

    } 
    catch ( Exception e) 
    {
        System.out.println(e);
    }

    BufferedReader buf = new BufferedReader(new InputStreamReader(in) );

    String input;
    input = buf.readLine(); 
    fill(input,buf);
}

填充定義為:

public void fill(String in,BufferedReader buf) 
{
    StringTokenizer token = new StringTokenizer(input); 
    no = token.countTokens();

    constraints = new Vector[noOfAttributes]; 
    for (int i=0; i < no; i++) 
    {
        c[i] = new Vector(); 
        names = new String[noOfAttributes];
    }

    for (int i=0; i < no; i++) 
    {
        names[i]  = token.nextToken();
    }

    while((in = buf.readLine()) != null) //<----error given here
    { 
        token = new StringTokenizer(input);
        Train example = new Train(no);

    }
    buffer.close();
}

fillData調用buffer.readLine()這是宣布拋出IOException -但你沒有捕獲異常witin fillData ,也沒有聲明它可能拋出。

最簡單的解決方法是將fillData的簽名fillData為:

public void fillData(String input, BufferedReader buffer) throws IOException

我也強烈建議不要fillData關閉閱讀器。 通常,獲取資源的相同代碼應負責關閉資源。 try-with-resources語句在這里最合適,因此read

try (BufferedReader buffer = new BufferedReader(new InputStreamReader(in))) {
    String input = buffer.readLine(); 
    fillData(input,buffer);
}

但是,即使這樣也不是理想的-因為您早先打開了輸入流。 建議始終將編碼傳遞給InputStreamReader構造函數,否則它將使用平台默認編碼。 在Java 7+中,您可以使用默認為UTF-8的Files.newBufferedReader

另外:

  • read聲明它拋出Exception方法通常不是一個好主意; 只拋出特定的異常
  • read捕獲Exception是一個壞主意。 只捕獲特定的異常
  • 繼續在read失敗后是一個壞主意- in將是無效的,導致故障隨即
  • 具有名為int類型的fileName的參數非常奇怪。 碰巧的是,您無論如何都沒有使用它-這有什么意義?

基本上, 所有異常處理和資源管理都需要大量工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM