Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich bin neu hier und gehe in eine EDVO-HTL wo wir im 1. Jahr Java lernen. Ich bin aber etwas voreilig und wollte schon mit Exceptions arbeiten. Die vorgefertigte Exception funktioniert wunderbar (Scanner-Exception für Integer => Exc. wird geworfen, wenn die Eingabe über 2 Mrd. ist, unter -2 Mrd. ist, ein String ist, oder eine Dezimalzahl ist). Zusätzlich wollte ich auch noch eine Benutzer-Exception basteln, die geworfen wird, wenn die Eingabe (per Scanner) kleiner eins ist. Die Benutzer-Exception hab ich nachgebildet nach einem Beispiel aus dem Buch Sprechen Sie Java?. Aber der Compiler kann bei der unten markierten Stelle das exceptionElement f nicht finden.
Code:
import java.util.Scanner;
import java.io.*;
public class Eratosthenes {
public static void main (String[] args) {
class UnderflowException extends Exception { //Deklariert neue Exc.
int underflowElement; //für Underflow (kleiner 1)
UnderflowException (int f) {
underflowElement = f;
}
}
int n, max;
boolean[] istPrim;
Scanner eingabe = new Scanner(System.in);
try {
System.out.print("Wie weit sollen die Primzahlen berechnet werden? ");
n = eingabe.nextInt();
if (n < 1) {
throw new UnderflowException(f); //MARKIERUNG
}
max = (int)(Math.sqrt(n)); //Berechnet die Quadratwurzel aus n und konvertiert sie in einen Integer
} catch (Exception e) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe darf keine Dezimalzahl sein und kein String!");
} catch (UnderflowException f) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe muss zumindest 1 sein!");
}
}
}
Selbst wenn ich public static void main (String[] args) throwsException { schreib, gehts nicht.
f ist nicht definiert. Wenn du z.b. eine Zeile vor der Markierung int f = 42; schreiben würdest, würde es natürlich gehen...
Das der Paramter, dem du den Konstruktor der UnderflowException übergibts, innerhalb dessen f heißt, hat nix damit zu tun WIE du diesen Parameter übergibst...
Und auf welchen Wert muss ich f setzen? Muss der Wert kleiner 1 sein (so wie vorgesehen), oder ist das egal?
Edit
@Ober mir:
Warum muss ich UnderflowException mit n verknüpfen, die vordefinierte Exception aber mit dem undeklarierten e?
Edit 2
Wenn ich dann
Code:
//Nur ein SNIPPET
try {
System.out.print("Wie weit sollen die Primzahlen berechnet werden? ");
n = eingabe.nextInt();
if (n < 1) {
throw new UnderflowException(n);
}
max = (int)(Math.sqrt(n)); //Berechnet die Quadratwurzel aus n und konvertiert sie in einen Integer
} catch (Exception e) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe darf keine Dezimalzahl sein und kein String!");
} catch (UnderflowException f) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe muss zumindest 1 sein!");
}
}
}
Die UnderflowException wird niemals auftreten, es darf nicht
Code:
} catch (Exception e) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe darf keine Dezimalzahl sein und kein String!");
} catch (UnderflowException f) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe muss zumindest 1 sein!");
}
heißen (wenn die Ausgabe "Die Eingabe muss zumindest 1 sein" irgendwann mal auftreten soll), sondern so:
Code:
} catch (UnderflowException f) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe muss zumindest 1 sein!");
} catch (Exception e) {
System.out.println("\nFehler bei Eingabe!\nDie Eingabe darf keine Dezimalzahl sein und kein String!");
}
Ich fahr heute in den Baumarkt. Soll ich mir ne Schaufel oder en Rasenmäher kaufen?
Wenn du jetzt verwirrt bist: Ich will damit ausdrücken, das du das entscheiden musst. Du hast die Klasse und auch den Kosntruktor von UnderflowException selbst gemacht, also musst du auch wissen wofür das gut ist und für was du diese Klasse später benutzen willst.
Wir wissen nämlich nicht wie dein Programm später genau arbeiten soll...
... und du weißt dafür nicht das ich heute ein Loch buddeln will
Wenn du zuerst schreibst "catch(Exception e)", dann fängt dieses ALLE Ausnhamen auf, da ALLE Ausnahme von "Exception" abgeleitet sind. (auch deine UnderflowException). Deswegen ist es sinnlos, nach "catch(Exception e)" noch ein weiteres catch-Statement zu haben, weil dieses niemals aufgerufen wird weil ja schon vorher alles abgefangen wurde...
Weil java.lang.Exception der Obertyp für alle Exceptions ist. Wenn catch(Exception e) am Anfang steht, dann fängt es auch die UnderflowException, und dann wird immer (auch wenn eine UnderflowException geworfen wurde)
"\nFehler bei Eingabe!\nDie Eingabe darf keine Dezimalzahl sein und kein String!" ausgegeben.
Das stimmt nicht so genau, es gibt noch die Errorklassen, die kann man ebenfalls mit throw werfen, die sind aber nicht von Exception abgeleitet.
Mit catch(Throwable t) lässt sich alles (auch die Errorklassen) abfangen.