BufferedReader - Startwert

  • Java

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • BufferedReader - Startwert

    Also ich wollte ein kleines Suchsystem mit Java bastellen, dass eine Textdatei nach einem Begriff durchsucht und die Zeile, in der der Begriff vorkommt ausgibt. Nun stehe ich vor folgendem Problem:
    Wenn ich meinen Code kompilieren will kommen diese Fehler:

    Quellcode

    1. ch = datei.read ();
    2. variable datei might not been initialized

    Quellcode

    1. datei.close ();
    2. variable datei might not been initialized

    Quellcode

    1. datei.close ();
    2. variable datei might not been initialized


    (datei ist meine Variable vom Typ Buffered Reader)

    Hier ist mein Code:

    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.*;
    2. class InputTest
    3. {
    4. public static void main (String args[])
    5. {
    6. BufferedReader datei;
    7. FileReader fr;
    8. String zeile;
    9. int ch;
    10. String str = "";
    11. BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
    12. System.out.print ("Bitte Suchbegriff eingeben: ");
    13. try
    14. {
    15. str = br.readLine();
    16. }
    17. catch (IOException exc)
    18. {
    19. System.out.println ("Fehler beim einlesen der Konsole!");
    20. }
    21. try
    22. {
    23. fr = new FileReader ("test.txt");
    24. datei = new BufferedReader (fr);
    25. }
    26. catch (FileNotFoundException exc)
    27. {
    28. System.out.println ("Datei konnte nicht gefunden werden!");
    29. }
    30. catch (IOException exc)
    31. {
    32. System.out.println ("Datei konnte nicht geöffnet werden!");
    33. }
    34. try
    35. {
    36. do
    37. {
    38. ch = datei.read ();
    39. zeile = datei.readLine ();
    40. if (zeile.indexOf (str) >0)
    41. {
    42. System.out.println (zeile);
    43. }
    44. }
    45. while (ch != -1);
    46. }
    47. catch (IOException exc)
    48. {
    49. System.out.println ("Dateifehler!");
    50. try
    51. {
    52. datei.close ();
    53. }
    54. catch (IOException exc2)
    55. {
    56. System.out.println ("Fehler. Datei wird geschlossen");
    57. }
    58. }
    59. try
    60. {
    61. datei.close ();
    62. }
    63. catch (IOException exc2)
    64. {
    65. System.out.println ("Fehler. Datei wird geschlossen");
    66. }
    67. }
    68. }
    Alles anzeigen


    Ich weiß, dass ich die Variable mit einem Startwert 'füllen muss', aber das habe ich doch in Zeile 26 getan!
    Was mache ich Falsch?
    Ich würde mich über eine schnelle Hilfe freuen!
    Viele Grüße, maxda
  • Du initialisierst 'datei' in einem try-Block, d.h. es kann vorkommen, dass die Datei niemals initialisiert wird, deshalb wird dir dein Compiler auch nen Fehler melden. Damit du kompilieren kannst musst du datei mit null initialisieren.
    Aber generell macht es wenig Sinn eine FileNotFoundException abzufangen und dann trotzdem mit der Datei weiter arbeiten zu wollen...
    Du solltest erst die Datei öffnen und dann abhängig davon ob datei == null ist weiter arbeiten oder eben nicht.

    Ausserdem kannst du die meisten catch-Klauseln noch zusammen fassen. Und das close() sollte unbedingt in die finally-Klausel.
  • Danke erstmal für die Antwort! Wenn ich das so mache:

    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.*;
    2. class InputTest
    3. {
    4. public static void main (String args[])
    5. {
    6. //BufferedReader datei;
    7. BufferedReader datei=null;
    8. FileReader fr;
    9. String zeile;
    10. int ch;
    11. String str = "";
    12. BufferedReader br = new BufferedReader (new InputStreamReader (System.in));
    13. System.out.print ("Bitte Suchbegriff eingeben: ");
    14. try
    15. {
    16. str = br.readLine();
    17. }
    18. catch (IOException exc)
    19. {
    20. System.out.println ("Fehler beim einlesen der Konsole!");
    21. }
    22. try
    23. {
    24. fr = new FileReader ("test.txt");
    25. datei = new BufferedReader (fr);
    26. }
    27. catch (FileNotFoundException exc)
    28. {
    29. System.out.println ("Datei konnte nicht gefunden werden!");
    30. }
    31. catch (IOException exc)
    32. {
    33. System.out.println ("Datei konnte nicht geöffnet werden!");
    34. }
    35. if (datei!=null)
    36. {
    37. try
    38. {
    39. do
    40. {
    41. ch = datei.read ();
    42. zeile = datei.readLine ();
    43. if (zeile.indexOf (str) >0)
    44. {
    45. System.out.println (zeile);
    46. }
    47. }
    48. while (ch != -1);
    49. }
    50. catch (IOException exc)
    51. {
    52. System.out.println ("Dateifehler!");
    53. try
    54. {
    55. datei.close ();
    56. }
    57. catch (IOException exc2)
    58. {
    59. System.out.println ("Fehler. Datei wird geschlossen");
    60. }
    61. }
    62. try
    63. {
    64. datei.close ();
    65. }
    66. catch (IOException exc)
    67. {
    68. System.out.println ("Fehler. Datei wird geschlossen");
    69. }
    70. }
    71. }
    72. }
    Alles anzeigen
    dann gibt es 'ne NullPointerException, obwohl ich ja überprüft habe, ob datei den Wert null hat!

    Edit: Also die NullPointerException kommt in Zeile 46. ?(
  • Das liegt daran, dass die Methode readLine vom BufferedReader null zurückgibt wenn der Stream leer ist.
    Du müsstest also bevor du irgendwas mit 'zeile' machst nochmal prüfen ob zeile != null ist.
    Wenn ich deinen Code richtig verstehe versuchst du sowas mit 'ch' zuverhindern, problem ist nur, dass die Schleifen-Bedingung erst geprüft wird denn du schon mit dem gelesenen String arbeiten willst.

    Ich hab deinen Code mal etwas aufgeräumt, ist zwar immer noch nicht toll aber vll. hilft dir das:
    Spoiler anzeigen

    Java-Quellcode

    1. import java.io.*;
    2. import java.util.Scanner;
    3. class InputTest
    4. {
    5. public static void main (String args[]) throws IOException {
    6. //Scanner zum lesen von der Konsole, mag ich lieber als nen InputStream
    7. Scanner cin = new Scanner(System.in);
    8. String zeile = null;
    9. BufferedReader lesestrom = null;
    10. //Dateipfad einlesen
    11. System.out.println("Bitte Dateipfad eingeben:");
    12. String dateipfad = cin.nextLine();
    13. File datei = new File(dateipfad);
    14. try{
    15. //Lesestrom initialisieren, kann ne FileNotFoundException werfen
    16. lesestrom = new BufferedReader(new FileReader(datei));
    17. //Suchbegriff einlesen
    18. System.out.println("Bitte Suchbegriff eingeben:");
    19. String suchbegriff = cin.nextLine();
    20. //Den Stream durcharbeiten, kann eine IOException werfen
    21. while((zeile = lesestrom.readLine()) != null ){
    22. if (zeile.indexOf(suchbegriff) > 0){
    23. System.out.println(zeile);
    24. }
    25. }
    26. }catch(FileNotFoundException fnfe){
    27. System.out.println("Datei nicht gefunden.");
    28. fnfe.printStackTrace();
    29. }finally{
    30. lesestrom.close();
    31. }
    32. }
    33. }
    Alles anzeigen



    Die IOExceptions kannste abfangen, hab das aber der Bequemlichkeit wegen sein gelassen, sonst musst man noch zusätzlich nen try-Block um das close machen und sowas nervt.