Exceptions

Status
Nicht offen für weitere Antworten.

maite

Mitglied
Hallo.
Habe ein Problem mit einer Aufgabe. Und zwar ist die class PhoneBookEntry gegeben. Dazu soll eine class PhoneBook erstellt werden und ein Programm PhoneBookManager, mit dem man sein Buch verwalten kann. Mein Problem ist nun (neben ein paar anderen kleineren Dingen), der catch-Block im PhoneBookManager. Der compiler sagt:
2 errors found:
File: C:\Privat\Java\HW10\PhoneBookManager.java [line: 68]
Error: C:\Privat\Java\HW10\PhoneBookManager.java:68: cannot find symbol
symbol : class FileNotFoundException
location: class PhoneBookManager
File: C:\Privat\Java\HW10\PhoneBookManager.java [line: 71]
Error: C:\Privat\Java\HW10\PhoneBookManager.java:71: cannot find symbol
symbol : class IOException
location: class PhoneBookManager
Wenn ich den catch-Block aber im PhoneBook direkt unter die werfende Methode setze, sagt er, dass diese exception schon gefangen wird - obwohl dem nicht der Fall ist. Ich hoffe, mir kann jemand sagen, was damit falsch läuft. Vielen dank im Voraus.

Hier der code:
-> PhoneBookEntry
Code:
public class PhoneBookEntry {
  
  private String lastName;
  private String firstName;
  private String phoneNumber;
  
  public PhoneBookEntry(String aLastName, String aFirstName, String aPhoneNumber) 
  {
    
    lastName = aLastName;
    firstName = aFirstName;
    phoneNumber = aPhoneNumber;
  }
  
  public String toString() {
    return firstName + " " + lastName + " : " + phoneNumber;
  }
}

-> PhoneBook
Code:
import java.util.*;
import java.io.*;

public class PhoneBook
{
  private PhoneBookEntry[] PhoneBookArray = new PhoneBookEntry[10];
  private int numEntries;
  /**
   constructor
   creates a new phone book
   */
  public PhoneBook()
  {
    int numEntries = 0;
    PhoneBookArray = new PhoneBookEntry[50];
  }
  /**
   loads entries from a file
   @param aFilename the name of the input file
   */
  public void loadEntry(String aFilename)
  {
    
    // Open source file for reading
    Scanner input = new Scanner(new File(aFilename));
    while (input.hasNext())
    {
      String line;
      Scanner lineScan = new Scanner(line);
      addEntry(lineScan.next(), lineScan.next(), lineScan.next());
    }
    input.close();
    
  }
  
//  public String toString()
//  {
//    String phonebookdata;
//    phonebookdata = "Last Name: /t" + lastName + "/tFirst Name: /t";
//    phonebookdata += "/tPhone Number: /t" + phoneNumber;
//    return phonebookdata;
//  }
  /**
   adds an entry to the phone book
   @param aLastName a last name
   @param aFirstName a first name
   @param aPhoneNumber
   */
  public void addEntry(String aLastName, String aFirstName, String aPhoneNumber)
  {
    if (numEntries >= PhoneBookArray.length)
    {
      resize();
    }
    PhoneBookArray[numEntries] = new PhoneBookEntry(aLastName, aFirstName, aPhoneNumber);
    numEntries++;
  }
 
  /**
   saves the phone book to a file
   @param aFilename the name of the destination file
   */
  public void save(String aFilename)
  {
    
    File destFile = new File(aFilename);
    if (destFile.exists() && destFile.canWrite()) {
      Scanner keyboard = new Scanner(System.in);
      
      System.out.println("File " + aFilename + " exists. Overwrite?");
      String answer = keyboard.next();
      char first = answer.toLowerCase().charAt(0);
      
      while ((first != 'y') && (first != 'n')) {
        System.out.println("File " + aFilename + " exists. " +
                           "Overwrite? (y or n)");
        answer = keyboard.next();
        first = answer.toLowerCase().charAt(0);
      }
      if (first == 'n')
        System.exit(0);
    }
    PrintWriter dest = new PrintWriter(destFile);
    for (int i=0; i<PhoneBookArray.length; i++)
    {
      dest.println(PhoneBookArray[i]);
    }
    dest.close();
  }
  private void resize()
  {
    PhoneBookEntry[] newOne = new PhoneBookEntry[PhoneBookArray.length + 50];
    System.arraycopy(PhoneBookArray, 0, newOne, 0, PhoneBookArray.length);
    PhoneBookArray = newOne;
  }
}
->PhoneBookManager
Code:
import java.util.*;
public class PhoneBookManager
{
  public static void printMenu() 
  {
    System.out.println();
    System.out.println("<PhoneBookManager commands:\n");
    System.out.println("a <last> <first> <phone> : add an entry in the phone "
                         + "book");
    System.out.println("l <filename> : load the entries from filename into the "
                         + "phone book");
    System.out.println("s <filename> : save the phone book to filename");
    System.out.println("p : print all the entries in the phone book");
    System.out.println("? : print the menu to the screen");
    System.out.println("q : quit the program");
    System.out.println();
  }
  
  public static void main(String[] args)
  {
    
    Scanner keyboard = new Scanner(System.in);
    PhoneBook yourPhonebook = null;
    char command = '?';
    yourPhonebook = new PhoneBook();
    
    System.out.println("\nWelcome to PhoneBookManager!\n");
    System.out.println("I have created a Phonebook for you. " +
                       "It has no entries yet." +
                       " Enter commands to change your Phonebook.\n");
    printMenu();
    
    while(true) {  // keep looping till user quits
      try {
        command = keyboard.next().charAt(0);
        
        switch (command) {
          case 'a':
            yourPhonebook.addEntry(keyboard.next(), keyboard.next(), keyboard.next());
            break;
          case 'l':
            yourPhonebook.loadEntry(keyboard.next());
            break;
          case 's':
            yourPhonebook.save(keyboard.next());
            break;
          case 'p':
            System.out.println(yourPhonebook);
            break;
          case '?':
            printMenu();
            break;
          case 'q':
            System.out.println("Thank you for using the phonebook. Goodbye.");
            System.exit(0);
            
          default:
            System.out.println("Unknown command: " + command);
            printMenu();
            break;
        }
      }
      catch (NoSuchElementException e)
      {
        System.out.println(e.getMessage());
        printMenu();
      }
      catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
      }
      catch (IOException e) {
        System.out.println(e.getMessage());
      }
      
      catch (InputMismatchException e)
      {
        System.out.println("wrong input");
        System.out.println("press '?' for help");
        System.out.println();
      }
      
      keyboard.nextLine();  // ignore rest of line
      System.out.println(yourPhonebook);
    }
  }
}

[/code]
 
S

SlaterB

Gast
du hast doch schon einige Import-Anweisungen,
weißt du noch nicht wie das geht?

es fehlt
import java.io.FileNotFoundException;
import java.io.IOException;
bzw.
import java.io.*;


cannot find symbol heißt z.B.: kenne Klasse nicht/ Variable oder Operation nicht deklariert
 

maite

Mitglied
Dankeschön. Hab jetzt import java.io.*; im PhoneBookManager importiert.
Daraufhin meint mein compiler:

3 errors found:
File: C:\Privat\Java\HW10\PhoneBookManager.java [line: 69]
Error: C:\Privat\Java\HW10\PhoneBookManager.java:69: exception java.io.FileNotFoundException is never thrown in body of corresponding try statement
File: C:\Privat\Java\HW10\PhoneBookManager.java [line: 72]
Error: C:\Privat\Java\HW10\PhoneBookManager.java:72: exception java.io.IOException is never thrown in body of corresponding try statement
File: C:\Privat\Java\HW10\PhoneBookManager.java [line: 76]
Error: C:\Privat\Java\HW10\PhoneBookManager.java:76: exception java.util.InputMismatchException has already been caught

Ich weiß echt nicht, wo ich welches catch statement hinschreiben soll. Als wir die Lektion durchgesprochen haben, hieß es, das kann man nie so genau sagen, kommt auf die Situation an. Grundsätzlich soll man versuchen, die try-Blöcke so lang wie möglich zu machen. Kann mir bitte jemand sagen, wie ich das jetzt mit den catch-Blöcken anstellen soll, oder mir nen Tipp oder ne allgemeine Regel geben? Nochmal vielen Dank im Voraus!
 
S

SlaterB

Gast
nun das ist alles recht einfach

InputMismatchException ist eine Unterexception von NoSuchElementException,
wenn letzte schon gefangen wird, dann macht erste DANACH keinen Sinn

vergleiche das mit einem Laufband für Lebensmittel,
vorne sortiert einer alles Obst raus und hinten steht jemand der nur auf Äpfel wartet,
der wird nie etwas bekommen, daher macht solch ein Code keinen Sinn


anders wäre es andersrum: wenn der Äpfel-Sortier vorne steht und danach das (restliche) Obst behandelt wird,
das klingt nützlich
---------

dann hast du noch zwei Exceptions, die im aktuellen Code überhaupt nicht geworfen werden,

Vergleich: am Laufband kommt nur Obst, und es will jemand Fernseher aussortieren,
auf ähnliche Weise doof, also Code ändern,

falls du nicht weißt, welche Exceptions kommen,
dann lasse try/ catch ganz weg und schon sagt dir der Compiler etwas wie
'Exception xy muss abgefangen oder weitergeworfen werden'


> Grundsätzlich soll man versuchen, die try-Blöcke so lang wie möglich zu machen.

das ist erstmal irrelevant,
sobald der Compiler zufrieden ist, ist schon mal gut was geschafft
 

maite

Mitglied
Dankeschön. Das mit der Unterexception wusst ich nicht. Mit der Sache, welche exceptions auftreten ist mein Problem, dass eben der compiler bei der loadEntry method in PhoneBook sagt, dass FileNotFoundException geworfen, aber nicht gefangen wird. Und nachdem ich die loadEntry method im PhoneBookManager aufrufe, wollt ich da diese exception fangen und frage mich, warum der compiler behauptet, es gebe sie nicht....
 

maite

Mitglied
Danke. Hab's gefunden. Der compiler hatte wie immer recht. Wenn man nicht im heading deklariert, dass die exception geworfen wird, kann er auch nicht wissen, dass er sie fangen soll....
 
S

SlaterB

Gast
INNERHALB von loadEntry tritt potentiell eine Exception auf (Scanner), die bisher nicht abgefangen wird,

aber AUSSERHALB von loadEntry ist dieses Problem nicht mehr da, das pflanzt sich nicht durch das gesamte Programm fort,

1. Lösung: anfangen in loadEntry
Code:
loadEntry() {
try {
...
} catch() 

}

dann brauchst du in der main wohl kein try/ catch meher oder zumindest die IO-Exceptions nicht mehr

2. Lösung: Exception weiterleiten

Code:
loadEntry() throws IOException, .. {
...
}
dann gibt loadEntry Ruhe und die Aufrufen müssen sich um die Expetions kümmern, so soll es wohl werden?
 

maite

Mitglied
Vielen lieben Dank! Genau die zweite Lösung meinte ich eben. Hatte die throws statements vergessen. Jetzt compilt er ohne Widerrede.
Jetzt heißt es nur noch beim Ausführen: Error: No 'main' method in 'PhoneBook' with arguments: ([Ljava.lang.String;)
Kein Plan, was er mir damit sagen will. Das soll doch gar keine main method haben, ist doch die class und nicht das Programm...
 

moormaster

Top Contributor
Offenbar wird versucht, die PhoneBook Class anstelle der PhoneBookManager Class auszuführen. Da musst du mal gucken, ob die Parameter beim Ausführen stimmen,
 

maite

Mitglied
Danke. Endlich Problem gelöst! Man sollte sich nicht blind auf den "run"-Befehl des Editors verlassen...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben