Exception abfangen

babuschka

Top Contributor
Hallo, liebes Forum,

ich beschäftige mich gerade erstmals mit dem Thema "Exceptions" und habe dazu mal folgende Klasse bzw. Methode versucht:

Java:
//Ausgegeben werden soll der größte Eintrag einer als Parameter übergebenen ArrayList.
import java.util.ArrayList;

public class Maximum{

Integer maximum(ArrayList<Integer> a){
Integer max=a.get(0);

try{
  
for(int i=1; i<a.size(); i++){
      
              if( a.get(i)>max ){
                           max=a.get(i);
               }
     }
  
    
}

catch(IndexOutOfBoundsException e){
  System.out.println("Leeres Array übergeben. Maximum kann nicht bestimmt werden.");
}

return max;
}

public static void main(String[] args){
	Maximum testclass=new Maximum();
	ArrayList<Integer> b = new ArrayList<Integer>();
	
	System.out.println(testclass.maximum(b));
}

}


Ich habe im Rumpf der main-Methode absichtlich keine Elemente in die ArrayList b eingefügt, weil ich ja diesen Fall abfangen möchte; es funktioniert jedoch nicht.

Sieht jemand, wieso?

LG
 
Zuletzt bearbeitet von einem Moderator:

HimBromBeere

Top Contributor
Naja, wenn deine Schleife alle Elemente durchlaufen soll, deine Liste aber keine Elemente hat, kann auch keine Exception geworfen werden... die "kristischen" Stellen werden also eh nie ausgeführt...
 

truesoul

Top Contributor
Ja pack mal dein :
Integer max=a.get(0);

in den try/catch Block. Dann bekommste die gewünschte Ausgabe ("Leeres Array übergeben. Maximum kann nicht bestimmt werden.").
 

Michael...

Top Contributor
Nein, dann kommt beim Kompilieren die Fehlermeldung:

cannot find symbol
symbol: variable max
Doch Du musst es halt anders programmieren ;-)
Die Exception tritt ausserhalb des des try catch Blocks auf (sollte auch in der Fehlermeldung stehen)

Eine Möglichkeit:
Java:
Integer max = null;
try {
    max = a.get(0);
    ...
Wobei ich in dem Fall eher die size() der List prüfen und dementsprechend eine eigene Exception werfen würde, anstatt eine IOoBException zu provozieren und deren Ausgabe zu überlagern.
 

pro2

Bekanntes Mitglied
Du darfst natürlich keine Variable im try/catch Block anlegen. Oben
Code:
Integer max;
und dann im Block
Code:
max = ...
.
 

Swoop

Gesperrter Benutzer
Du darfst natürlich keine Variable im try/catch Block anlegen. Oben
Code:
Integer max;
und dann im Block
Code:
max = ...
.


Anstatt
Code:
Integer
könnte man auch
Code:
int
verwenden ;)
 

babuschka

Top Contributor
Jetzt bin ich verwirrt...

Ich habe die Variable jetzt überhalb des try Blocks deklariert, okay und in dem try Block initialisiert.

Aber wieso tritt der Fehler außrhalb davon auf?



Irgendwie verstehe ich es noch überhaupt nicht.
 

babuschka

Top Contributor
Okay, mit dem Hinweis, daß ich außerhalb deklarieren und innerhalb des try-Blocks initialisieren muss, klappt es jetzt.


Der Grund ist also, daß die Variable nur innerhalb des try-Blocks gelten würde. Was ist falsch daran, ich benötige sie doch auch nur dort?


Und noch eine andere Frage. Der IndexOutOfBoundsException tritt bei einem leeren Array dort auf, wo ich

max=a.get(0)

habe? Weil es so ein erstes Element nicht gibt?
 

babuschka

Top Contributor
Deswegen frage ich ja, weil bei mir klappt es nur, wenn ich die Variable VOR der Methode selbst deklariere.

Und das verstehe ich nicht.

Erstens müsste das doch auch gehen, wenn ich sie in der Methode (noch vor dem try-Block deklariere) und zweitens sogar, wenn ich sie im try-Block deklariere und initialisiere, weil ich sie doch nur dort brauche.
 

babuschka

Top Contributor
Dies ist die Version, die bei mir klappt:

Java:
//Ausgegeben werden soll der größte Eintrag eines als Parameter übergebenen Arrays.
import java.util.ArrayList;

public class Maximum{
	Integer max;	
Integer maximum(ArrayList<Integer> a){
			

try{
	
	max=a.get(0);	  
for(int i=1; i<a.size(); i++){
      
              if( a.get(i)>max ){
                           max=a.get(i);
               }
     }
  
    
}

catch(IndexOutOfBoundsException e){
	
	System.out.println("Leeres Array: Maximum kann nicht bestimmt werden.");
}

return max;
}

public static void main(String[] args){
	Maximum testclass=new Maximum();
	ArrayList<Integer> b = new ArrayList<Integer>();
	
	System.out.println(testclass.maximum(b));
}

}
 

HimBromBeere

Top Contributor
Du willst doch auf dein max auch beim return zugreifen, d.h. du könntest es bestenfalls noch lokal in der Methode deklarieren, anstelle von klassenweit.
 

babuschka

Top Contributor
Eben, aber wenn ich die Deklaration gleich als erstes in den Methodenrumpf schreibe, kommt die Meldung:

might not have been initialized


Wenn ich dann aber das Initialisieren auch wieder dazu schreibe... kommt wieder die gewünschte Meldung mit der Exception nicht...


:oops:
 

HimBromBeere

Top Contributor
Java:
class Maximum{
	Integer maximum(ArrayList<Integer> a){
	    Integer max = null;    
	    try{
		    max=a.get(0);     
		    for(int i=1; i<a.size(); i++){
		    	if( a.get(i)>max ){max=a.get(i);}
		    }
	    } catch(IndexOutOfBoundsException e){
	    	System.out.println("Leeres Array: Maximum kann nicht bestimmt werden.");
	    }
	    return max;
	}
}
Also bei mir läuft´s... hab aber auch noch ´ne Klammer hinzugefügt.

EDIT: Ich erinnere dich an dieser Stelle nochmal an einen vorigen Beitrag:
Wobei ich in dem Fall eher die size() der List prüfen und dementsprechend eine eigene Exception werfen würde, anstatt eine IOoBException zu provozieren und deren Ausgabe zu überlagern.
 

HimBromBeere

Top Contributor
Initialisieren macht man nur einmal... darum heißt es auch INITialisieren. Das, was du mit
Code:
max = a.get(0)
machst, ist eine stinknormale Zuweisung (= null ist auch nichts anderes, da du´s aber das erste mal machst, spricht man von der erstmaligen Zuweisung - der Initialisierung).

EDIT: Du kannst aber auch einfach deine Variable trotzdem im try-Block deklarieren und nach dem Abarbeiten der Schleife return max verwenden. Unter den cath-Block schreibst du dann return null.
 
Zuletzt bearbeitet:

babuschka

Top Contributor
Okay, ich merke schon.

Es wird zeit, dass ich irgendwie die Prüfung schaffe, dann zwei bis 5 Kreuze in den Kalender mache und mich dann demütig vom Javabereich entferne... :autsch:
 

xehpuk

Top Contributor
O je, es kompiliert, aber bitte nicht nachmachen! :shock:

Java:
int max = maximum(new ArrayList<Integer>()); // schöne NullPointerException

Code:
IndexOutOfBoundsException
ist ein Laufzeitfehler. Nicht abfangen!
Mit
Code:
int
, nicht mit
Code:
Integer
rechnen!

Dass der Compilerfehler angezeigt wurde, hatte auch einen guten semantischen Grund. Wenn man den Fehler abfängt, kann man nichts Sinnvolles zurückgeben.

Variablen sind nur in dem Block sichtbar, in dem sie deklariert wurden.

Java:
void a() {
    {
        int a = 0;
    }
    a = 0; // Whoops!
}
 

babuschka

Top Contributor
Ich kann Deine Einwände leider nicht nachvollziehen.

Ich würde es gerne, verstehe aber nicht, was Du meinst.


Wieso NullPointerException?

Wieso nicht abfangen?...
 

xehpuk

Top Contributor
Wieso NullPointerException?
Probier es aus:
Java:
import java.util.ArrayList;

public class MaxInt {
	public static void main(final String[] args) {
		final int max = maximum(new ArrayList<Integer>());
	}

	static Integer maximum(final ArrayList<Integer> a) {
		Integer max = null;
		try {
			max = a.get(0);
			for (int i = 1; i < a.size(); i++) {
				if (a.get(i) > max) {
					max = a.get(i);
				}
			}
		} catch (final IndexOutOfBoundsException e) {
			e.printStackTrace();
		}
		return max;
	}
}
Oder kürzer:
Java:
public static void main(final String[] args) {
	Integer i = null;
	int j = i;
}
Java versucht, aus der
Code:
null
den primitiven Wert zu ziehen, was natürlich nicht funktioniert.

Wieso nicht abfangen?...
Gegenfrage: Wieso abfangen? Ist
Code:
null
ein guter Rückgabewert?
Laufzeitfehler sind unerwartete Fehler. Sie sollten nur auftreten, wenn der Programmierer rumgemurkst hat.
Unchecked Exceptions — The Controversy (The Java™ Tutorials > Essential Classes > Exceptions)

Eine denkbare Lösung:
Java:
static int maximum(final ArrayList<Integer> a) {
	if (a.isEmpty()) {
		throw new IllegalArgumentException("Liste darf nicht leer sein!");
	}
	int max = a.get(0);
	for (int i = 1; i < a.size(); i++) {
		if (a.get(i) > max) {
			max = a.get(i);
		}
	}
	return max;
}
 

babuschka

Top Contributor
Das geht dann wohl über meine Fähigkeiten hinaus.

Ich sehe nicht, wo ich da was falsch gemacht habe.

Bei mir klappt sowohl der Fall, daß die ArrayList leer ist, als auch der Fall, daß Elemente enthalten sind.

Im ersten Fall wird die Warnung ausgegeben, im zweiten Fall das größte Element.


:bahnhof:
 

babuschka

Top Contributor
Hallo, ich wollte mal fragen, ob man das Ganze nicht auch so machen kann:

Java:
import java.util.ArrayList;

class Maximum{

Integer maximum(ArrayList<Integer> a){
Integer max;
max=a.get(0);
if(a.size()==0){
   max=null;
   return max;
}

for(int i=1; i<a.size();i++)
{
    if(a.get(i)>max){
         max=a.get(i);
  }

return max;

}

Erfüllt das nicht auch die Aufgabenstellung?

LG
 

babuschka

Top Contributor
Ich habe noch ein paar Verbesserungen vorgenommen.

Könnt Ihr mir bitte sagen, ob folgender Code okay ist bzw. ob er eine Alternative zu dem obigen Krams mit catch und try ist?

Ich habe ein paar Beispiele ausprobiert (leere Liste und verschiedene gefüllte Listen) und bei mir funktioniert es; dennoch interessiert mich Eure Meinung.

Java:
import java.util.ArrayList;

class Maximum{

   Integer maximum( ArrayList<Integer> a ) {
      Integer max;

      if( a.isEmpty() ) {
          max = null;
          return max;

      }

   max = a.get(0);
     for( int i = 1; i < a.size(); i++ ) {
           if( a.get(i) > max ) {
                 max = a.get(i);
      }

   return max;

   }

public static void main( String[] args) {
      ArrayList<Integer> testArrayList = new ArrayList<Integer>();
      Maximum testClass = new Maximum();
      testArrayList.add(1);
      testArrayList.add(200);
      testArrayList.add(5);
      testArrayList.add(50);

     System.out.println( testClass.maximum( testArrayList ) );
  }
}

Bei diesem Beispiel wird bei mir auf der Konsole 200 ausgegeben.
Wenn ich in die Liste
Code:
testArrayList
keine Elemente einfüge, wird
Code:
null
ausgegeben.
 

HimBromBeere

Top Contributor
Du solltest nur wahrscheinlich statt Integer mal int verwenden... ansonsten fällt mir nichts ein (abgesehen von der unerhebl,ichen Kleinigkeit, dass wohl niemand eine Klasse Maximum nennt und dann auch noch nie einzige Funktion).
Achja, eine Sache noch: wenn man schon das Interface Iterable irgendwann implementiert (z.B. mittels einer Collection wie ArrayList), dann durchlaufe die auch mal mit dem gelieferten Iterator... dafür is er da:D
 
Zuletzt bearbeitet:

HimBromBeere

Top Contributor
den hier: List (Java Platform SE 6)
Alle Klassen, die
Code:
Collection
implementieren (wozu irgendwie auch deine
Code:
ArrayList
gehört), besitzen die Methode
Code:
iterator()
, mit welchem du sukzessive jedes Element durchlaufen kannst.
In deinem Fall ist es eher irrelevant, ob du mittels for-Schleife oder Iterator durch die Elemente gehst, aber so machem Benutzer der ersten Variante soll in ähnlichen Anwendungsfällen bereits eine sog
Code:
CurrentModificationException
um die Ohren geflogen sein, deren Ursachenfindung immer ein bisschen hakelig ist...
 

EnHancEd[]

Aktives Mitglied
Oder als Beispiel:

Java:
ArrayList<String> list= new ArrayList<String>();

list.add("So ");
list.add("geht ");
list.add("das");


for(String k: list){
System.out.print(k);
}


greetz
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
A Int Eingabe: String mit Exception abfangen. Aber wie? Java Basics - Anfänger-Themen 3
OnDemand Exception Abfangen Java Basics - Anfänger-Themen 5
D [jni] loadLibrary Exception abfangen Java Basics - Anfänger-Themen 9
S Exception abfangen Java Basics - Anfänger-Themen 2
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Spin Exception abfangen Java Basics - Anfänger-Themen 3
M Exception abfangen? Java Basics - Anfänger-Themen 3
G Eine exception mit negativen zahlen abfangen ? Java Basics - Anfänger-Themen 11
B Programm würft Exception, kann sie aber nicht abfangen! Java Basics - Anfänger-Themen 25
rambozola selbst definierte exception abfangen funzt nicht Java Basics - Anfänger-Themen 14
V JOP.showInputDialog Abbrechen Button, Exception abfangen Java Basics - Anfänger-Themen 2
F Exception in while-Schleife abfangen? Java Basics - Anfänger-Themen 2
ven000m Exception abfangen Java Basics - Anfänger-Themen 9
L Java App + Exception abfangen Java Basics - Anfänger-Themen 2
C Exception abfangen->Klappt nicht ;( Java Basics - Anfänger-Themen 2
EagleEye Exception abfangen Java Basics - Anfänger-Themen 15
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
W Null-Pointer Exception beim Programmstart Java Basics - Anfänger-Themen 8
Ostkreuz String Exception Java Basics - Anfänger-Themen 8
Fiedelbambu Exception in Application constructor Java Basics - Anfänger-Themen 3
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
F abbruch Exception lässt sich nicht erstellen Java Basics - Anfänger-Themen 2
U Warum kriege ich hier eine nullpointer exception, sehe den Fehler nicht (swing) Java Basics - Anfänger-Themen 1
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
N Exception beim Verwenden von Arraylist? Java Basics - Anfänger-Themen 10
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
S JavaKara Null Exception Error Java Basics - Anfänger-Themen 4
LiFunk Exception: es dürfen nur Nummern eingelesen werden Java Basics - Anfänger-Themen 6
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
1 Exception Java Basics - Anfänger-Themen 2
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
I JAX-RS Exception Handling Java Basics - Anfänger-Themen 4
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
J null exception Array Java Basics - Anfänger-Themen 5
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
C Exception-Frage Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
N Wie teste ich eine geworfene Exception? Java Basics - Anfänger-Themen 8
R Methoden ArrayList clonen wirft exception Java Basics - Anfänger-Themen 3
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2
N Exception werfen bei falscher Datumseingabe Java Basics - Anfänger-Themen 14
A Exception handeling mit finally und objektreferenzen Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
S Exception Java Basics - Anfänger-Themen 2
J Exception-Aufgabe Java Basics - Anfänger-Themen 8
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
Z Fragen zu Exception (Throws/throw) Java Basics - Anfänger-Themen 7
OSchriever Exception für Abbrechen-Schaltfläche JOptionpane Java Basics - Anfänger-Themen 9
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
J Exception unreachable Java Basics - Anfänger-Themen 12
O unchecked Exception Java Basics - Anfänger-Themen 4
P Exception werfen Java Basics - Anfänger-Themen 15
B EJB und Arquillian - bekomme Nullpointer Exception beim Aufruf der EJB Klasse Java Basics - Anfänger-Themen 40
S Exception bei Verwendung von LocalDate Java Basics - Anfänger-Themen 19
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
D Warum die Nullpointer Exception Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
I OOP Was ist die "Exception Hierarchie" ? Java Basics - Anfänger-Themen 3
U Null Exception aber keine Ahnung warum Java Basics - Anfänger-Themen 5
G Exception und Ausgabe der Duplikate Java Basics - Anfänger-Themen 6
H Try Catch Throw Exception Java Basics - Anfänger-Themen 1
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
Mosquera Exception Java Basics - Anfänger-Themen 5
M rekursive division/0 mit exception Java Basics - Anfänger-Themen 18
N Nullpointer exception Java Basics - Anfänger-Themen 4
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
S Array Grenzen-Exception Java Basics - Anfänger-Themen 11
E InputStream im Servlet wirft Exception Java Basics - Anfänger-Themen 5
D Erste Schritte Java.lang.NullPointer.Exception Java Basics - Anfänger-Themen 8
G Arrays out of Bounds exception Java Basics - Anfänger-Themen 2
H Compiler-Fehler Out of Bunce Exception bei einem Char Java Basics - Anfänger-Themen 6
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
C Null Pointer Exception Java Basics - Anfänger-Themen 10
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
G Null Pointer Exception Java Basics - Anfänger-Themen 4
GreenTeaYT Exception und zur OOP fragen? Java Basics - Anfänger-Themen 3
O Exception bei Parse-Vorgang Java Basics - Anfänger-Themen 17
T Exception Problem Java Basics - Anfänger-Themen 5
Z Getter/Setter NullPointer Exception Java Basics - Anfänger-Themen 6
W Nullpointer Exception bei .add(...) Java Basics - Anfänger-Themen 6
L Input/Output InputMismatch.Exception Java Basics - Anfänger-Themen 7
B Exception Liste von Liste Java Basics - Anfänger-Themen 3
D Throw Exception Java Basics - Anfänger-Themen 2
MiMa JavaDoc Exception @throws schlagen an Java Basics - Anfänger-Themen 4
J Exception in thread "main" Java Basics - Anfänger-Themen 1
B Exception richtig einbinden Java Basics - Anfänger-Themen 1
M Exception soll Werte mitgeliefert bekommen Java Basics - Anfänger-Themen 12
M Selbstdefinierte Exception Java Basics - Anfänger-Themen 5
B Exception Throwable Java Basics - Anfänger-Themen 11
M Erste Schritte Start Methode - Exception Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben