适当地放置尝试和捕获

时间:2015-05-10 13:28:34

标签: java multithreading ioexception

我在正确使用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");

        }   

    }

}

4 个答案:

答案 0 :(得分:2)

  1. 在try / catch之前将Scanner变量sc初始化为null。错误消失了。
  2. 请勿尝试同时使用扫描程序读取BufferedReader文件,而是使用其中一种文件。
  3. Scanner sc = null;
    try {
        sc = new Scanner(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        // exit program here?
    }
    

答案 1 :(得分:0)

你遇到的问题是由于runnable是异步调用的,所以没有“等待”它,它也没有返回值。

取决于您的应用程序的其余部分,以及如何调用它,并行调用多少内容等,您有两个主要选项:

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”。一个Callable可以像Runnable一样调度,但它可以抛出异常,并且它可以有一个返回值。

public MyCallable implements Callable<String> {

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

}

现在,如果你使用这种方法,你需要某种Excutor,并提交callable来执行。这将返回

Future<String>

你可以调用各种get()方法来抛出异常(如果你的代码抛出异常或者你得到超时),或者ot将返回实际的返回值。

一个简单的例子:

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

答案 2 :(得分: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();
    }
}

答案 3 :(得分:0)

你想使用try catch place那里的东西会像这一行一样失败:

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");
}