Wątki i czytanie z pliku

0

Muszę zrobić wątek który czyta ilość linii z pliku tekstowego. Kompilator stwierdził, ze kod metody numbersLine() jest niedostępny pewnie wyjątki w jakis sposób przeszkadzają bo jak zrobiłem tą metodę drukującą tylko jakis tekst to nie było problemu . Co mam zrobić z wyjątkami pojawiającymi się w metodzie numbersLine() ?

public class FirstTheard implements Runnable  {
	 
	
	 @Override
     public void run(){
		
		while(true) {
			 
	  		try{
	               Thread.sleep(200);
	          
	            } catch (InterruptedException e){
	               System.out.println("wątek przerwany");
	               return;
	            }
	
			 
			
		
		}
		numbersLine();   
        }
	 
	 
	
	
	 public void numbersLine() {
		 String fname = System.getProperty("../towary.txt"); 
		 FileReader fr;
		
         System.out.println("Metoda wydrukuj100");
         try {
  		fr = new FileReader(fname);
		BufferedReader bfr = new BufferedReader(fr);
		 String line="";
  		 int licznik=0;
  		 while((line = bfr.readLine())!= null){
  			 
  			 licznik=licznik+1;
  		     }
  		 System.out.println("Ilosc linii "+licznik);
  		 
  		 fr.close();
         }catch (IOException e){
             System.out.println("Uwaga");
            
          }
	 }
	 
     }
0

Masz zrobić dokładnie to samo, co z innymi wyjątkami w Twoim kodzie:

try {
   // tu kod, z ktorego lapiesz wyjatki
} catch(KlasaWyjatku exception) {
   // tu obsluga wyjatku
}
0
catch (IOException e){
             System.out.println("Uwaga");

          }

Jak robisz coś takiego to nawet nie wiesz jaki wyjątek poleciał. Już lepiej zrobić tak to przynajmniej zobaczysz co się stało:

e.printStackTrace();
0

W numbersLine mam wyjątek .

0

Kompilator stwierdził, ze kod metody numbersLine() jest niedostępny pewnie wyjątki w jakis sposób przeszkadzają bo jak zrobiłem tą metodę drukującą tylko jakis tekst to nie było problemu

O ile dobrze widzę to metoda numbersLine() jest poza pętlą while(true) {}...

0

Fakt poprawiłem ale teraz pojawiają się komunikaty

Exception in thread "Thread-0" java.lang.NullPointerException
	at java.io.FileInputStream.<init>(FileInputStream.java:130)
	at java.io.FileInputStream.<init>(FileInputStream.java:93)
	at java.io.FileReader.<init>(FileReader.java:58)
	at zad53.FirstTheard.numbersLine(FirstTheard.java:41)
	at zad53.FirstTheard.run(FirstTheard.java:13)
0

To znaczy, że masz nulla w linijce 41 na którym próbujesz wykonać operacje

0

Ta linia jest nonsensowna. Co właściwie chciałeś uzyskać?

String fname = System.getProperty("../towary.txt"); 

Z tego ten null.

1

Nie wiem co Ci stwierdził kompilator. Sądzę, że linter dość ostro wypowiedział się o tym fragmentcie:

     @Override
     public void run(){

        while(true) {

            try{
                   Thread.sleep(200);

                } catch (InterruptedException e){
                   System.out.println("wątek przerwany");
                   return;
                }

        }
        numbersLine();   
        }

Przecież numbersLine(); nigdy nie zostanie wywołane, bo wcześniej masz while(true)

0

@butek: masz jakieś dziwne podejście, Wywołanie metody w nieosiagalnym bloku, jakies nieskończone pętle ...
Proponuję zrobić jak normalny człowiek z użyciem Callable:

public final class CountLinesTask implements Callable<Long> {

    private final Path file;

    public CountLinesTask(Path file) {
        this.file = file;
    }

    @Override
    public Long call() throws Exception {
       try (Stream<String> lines = Files.lines(file)) {
          return lines.count();
       }
    }
}

U mnie działa:

class CountLinesTaskTest {

    ExecutorService executorService = Executors.newSingleThreadExecutor();
    Path file = TestUtils.getPath("concurrency/random_numbers_1.txt");

    @Test
    void countLinesTest() throws Exception {
        //given
        Callable<Long> countLinesTask = new CountLinesTask(file);

        //when
        long counter = executorService.submit(countLinesTask).get();

        //then
        Assertions.assertEquals(1000, counter);
    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1