Wątki i czytanie z pliku

Wątki i czytanie z pliku
BU
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:13
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() ?

Kopiuj
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");
            
          }
	 }
	 
     }
zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:101
0

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

Kopiuj
try {
   // tu kod, z ktorego lapiesz wyjatki
} catch(KlasaWyjatku exception) {
   // tu obsluga wyjatku
}

Berylo
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:344
0
Kopiuj
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:

Kopiuj
e.printStackTrace();
Michał Sikora
Michał Sikora
A tam. catch (IOException ignored) { }.
Berylo
albo tak: catch (Exception e){ //it will never happen}
BU
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:13
0

W numbersLine mam wyjątek .

rrowniak
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 miesiące
  • Postów:82
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) {}...


BU
  • Rejestracja:ponad 6 lat
  • Ostatnio:prawie 6 lat
  • Postów:13
0

Fakt poprawiłem ale teraz pojawiają się komunikaty

Kopiuj
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)
Berylo
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Postów:344
0

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

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:43 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

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

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

Z tego ten null.


jeden i pół terabajta powinno wystarczyć każdemu
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:7 dni
  • Postów:3277
1

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

Kopiuj
     @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)

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
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:

Kopiuj
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:

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

}


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.