2015-05-10 59 views
1

正確使用try和catch語句有問題。正確的地方嘗試和捕獲

以前我在main方法中有所有這些代碼,它的工作,但是當我想把它分解線程問題出現。

以前我使用'拋出IOException,但在實現Runnable的課上,我不能使用throws IOException,因爲有錯誤。 我想得到一些建議,如何使這個代碼再次工作,但在線程。

我會很感激所有的建議,使我的代碼更好。

public void run() { 
     File file= new File("Towar.txt"); 
     Scanner sc; 
     BufferedReader br; 
    try { 
     sc = new Scanner(file); 
     br= new BufferedReader(new FileReader(file)); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 


     String line; 
     int count=0; 
     while (sc.hasNextLine()) { 

      line = br.readLine(); 
      if (line==null)break; 

      int space = line.indexOf(" "); 

      int id_towaru = Integer.parseInt(line.substring(0, space)); 
      double waga = Double.parseDouble(line.substring(space)); 
      Towar tow= new Towar(id_towaru,waga); 
      count++; 
      if (count%200==0)System.out.println("Created: "+ count + " objects"); 

     } 

    } 

} 
+0

用'try' /'catch'包裝它,有什麼問題? – Maroun

+0

請向我們展示您嘗試使用try/catch的方法。否則,我們怎麼能說出你可能做錯了什麼? –

+0

當我用try-catch自動換行時,非初始化變量有問題 – jawjaw

回答

2
  1. 初始化掃描儀SC變量爲null tr​​y/catch語句之前。錯誤消失了。
  2. 不要嘗試同時使用掃描器讀取BufferedReader,而是使用其中一個或另一個。

Scanner sc = null; 
try { 
    sc = new Scanner(file); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
    // exit program here? 
} 
+0

謝謝,但我用「while(sc.hasNextLine())」,因爲如果我使用br.readline()!= null,我只讀取了文件中一半的行。 – jawjaw

+0

@jawjaw:那麼你在做別的錯事。你有一個錯誤,解決方案是找到並修復錯誤,而不是像你一樣使用一些脆弱的錯誤。 –

+1

@jawjaw如果你正在使用'sc.hasNextX()',得到X的正確方法是調用'sc.nextX()',無論X是什麼。由於您正在使用'sc.hasNextLine()',因此您應該使用'sc.nextLine()'來讀取下一行。 – AJMansfield

0

您有由一個事實,即一個可運行的,就是要異步調用,所以沒有什麼「等待」它,也不能有返回值導致的問題。根據您的應用程序的其餘

,以及如何被調用,有多少事情是並行稱爲等等,你有兩個主要選擇:

1)如果事情是開始運行線程這個runnable並不關心結果,你可以在run()方法內執行try catch。它會再向上到catch塊來採取適當的措施:

public void run() { 
    try { 
     // do some stuff 
    } catch (Exception e) { 
     // write some kind of error log 
    } 
} 

2)另一種方式做同樣的事情是做使用「可贖回」,而不是「可運行」。 Callable可以像Runnable一樣調度,但它可以拋出異常,並且可以有返回值。

public MyCallable implements Callable<String> { 

    public String call() throws Exception { 
     // do stuff 
    } 

} 

現在,如果您使用這種方法,您將需要某種Excutor,並提交可執行文件。那麼這將返回

Future<String> 

上,您可以調用各種的get()會拋出異常(如果你的代碼拋出一個異常,或者你會得到一個超時)的方法,或OT將返回實際的返回值。

一個簡單的exaple:

http://www.journaldev.com/1090/java-callable-future-example

0

這是你的新方法應該是什麼樣子。以下代碼將在正確的位置捕獲異常,並且還會關閉所有流以防止資源泄漏。

public void run() { 
    try { 
     File file = new File("Towar.txt"); 
     Scanner sc = new Scanner(file); 
     BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 
     int count = 0; 
     while (sc.hasNextLine()) { 

      line = br.readLine(); 
      if (line == null) 
       break; 

      int space = line.indexOf(" "); 

      int id_towaru = Integer.parseInt(line.substring(0, space)); 
      double waga = Double.parseDouble(line.substring(space)); 
      Towar tow= new Towar(id_towaru,waga); 
      count++; 
      if (count % 200 == 0) 
       System.out.println("Created: " + count + " objects"); 

     } 
     sc.close(); 
     br.close(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 
0

要使用嘗試捕捉的地方有東西能像失敗在這行:

try{ 
int id_towaru = Integer.parseInt(line.substring(0, space)); 
} 
catch(Exception e){ 
//something you want this part to do, eks: 
System.out.println("did not find Integer"); 
} 
1

雖然@HovercraftFullOfEels已經給了你一個答案,我想解釋爲什麼你收到此錯誤。

Java要求在使用變量之前分配一個變量。見Chapter 16. Definite Assignment - 16.2.15. try Statements

V是一個catch塊當且僅當v之前明確賦值try塊之前明確賦值。

...早些時候same chapter

每一個局部變量(§14.4)和每一個空白的最後一個字段(§4.12.4,§8.3.1.2)必須有一個明確指定值時其價值的任何訪問發生。

+0

的確,謝謝! 1+ –

0
catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

已發生異常後,你的代碼繼續興高采烈地解析輸入文件。這沒有意義,因爲該文件不存在,所以應該跳過解析。有兩種方法可以做到這一點:

  1. e.printStackTrace();後面加上return。這將跳過方法主體的其餘部分
  2. 將代碼中的while語句下方的catch塊移動到try/catch語句中,將整個解析代碼包裝在一起。

File file= new File("Towar.txt"); 
Scanner sc; 
BufferedReader br; 
try { 
    sc = new Scanner(file); 
    br= new BufferedReader(new FileReader(file)); 

    String line; 
    int count=0; 
    while (sc.hasNextLine()) 
    { 
     line = br.readLine(); 
     if (line==null)break; 

     int space = line.indexOf(" "); 

     int id_towaru = Integer.parseInt(line.substring(0, space)); 
     double waga = Double.parseDouble(line.substring(space)); 
     Towar tow= new Towar(id_towaru,waga); 
     count++; 
     if (count%200==0)System.out.println("Created: "+ count + " objects"); 
    } 
} 
catch (FileNotFoundException e) 
{ 
    e.printStackTrace(); 
} 

雖然第一個解決方案可能是更好看(因爲它避免了過度的壓痕),第二個可能會更容易理解。