Else-Anweisung Problem

smart85

Mitglied
Hallo liebe Leute,

ich quelle mich schon seit einigen Stunden und verstehe nicht wieso im folgendem Code die else-Anweisung nicht ausgegeben wird.

Zuerst schreibe ich was ich da mache, ich gebe einen Regisseur ein von der Tastatur und es erfolgt ein Vergleich des eingegebenen Regisseur mit dem aus meiner .txt Liste, die ich jetzt nicht aufführe. In dieser .txt Datei sind Filme mit zugehörigen Regisseuren gespeichert...

Mein Problem beim Fehlerabfangen. Ich schreibe z.B. anstatt Steven Spielberg irgendein Quatsch...z.B. "bla bla" und es soll auf meiner Console folgendes ausgegeben werden: "Der Film existiert nicht"

aber diese Anweisung wird nicht ausgegeben...ich verstehe nicht warum

Bitte helft mir, ich möchte verstehen wo mein Fehler liegt

Mein Code:

Java:
//package com.tutego.insel.xml.dom;
import java.io.*;

public class Main {

	public static void main(String[] args) throws Exception {
		
		String regisseur="";
	    MovieLister mlist = new MovieLister();
  	
	    		System.out.print("Bitte geben Sie den Regisseur ein: ");
	    		InputStreamReader isr = new InputStreamReader(System.in);//Eine komplette Zeile von der Standardeingabe lesen
	    	    BufferedReader buffer = new BufferedReader(isr);
	    		regisseur = buffer.readLine();//Texteingabe von Tastatur.

	    	    buffer.close();
	    		Movie[] film = mlist.moviesDirectedBy(regisseur);
	    		 
	    		//for(Movie m : film)  
	    		int i=0;
    			if(film != null){

	    	      for (i=0; i<film.length; i++)
	    	    	  System.out.println(regisseur + ">>> "+film[i].getTitle());
	    				//j++;	    		
	    	    }
    			else 
    			 System.out.println("Der Film existiert nicht");


Danke im Voraus!!!
 
Scheinbar gibt mlist.moviesDirectedBy(regisseur); kein null zurück. Mehr kann man da nicht sagen, wir kennen den Rest von deinem Code ja nicht.
 
Du schreibst:
Wenn film ungleich null ist, dann such da durch. Wenn nicht, gib die Fehlermeldung aus. Film initialisiert du aber vorher immer, also wird die Variable nie null sein 😉 Ich glaub nicht, dass du null da zurück gibst.

Mach dir doch z. B. einen boolean, dann geh durch die Liste, wenn du deinen Film findest setzt du den boolean auf true (bzw. gibst true zurück) und wenn nicht bleibt die Variable false. Dann kannst du damit deine Meldung ausgeben.. zum Beispiel!
 
die Methode MoviesDirectedBy wird aus dieser Klasse aufgerufen...

Java:
import java.util.ArrayList;

public class MovieLister {
	
private IMovieFinder movieFinder = new XMLMovieFinder();
public MovieLister(){}

	public Movie[] moviesDirectedBy(String director){		

   	ArrayList<Movie> allefilme = movieFinder.findall();
   	ArrayList<Movie> filme = new ArrayList<Movie>();
   
   	
	   	for(int j = 0; j < allefilme.size(); j++){
	   		if(allefilme.get(j).getDirector().equals(director)){
	   			filme.add(allefilme.get(j));
	   		}
	   	}
	Movie[] filmliste = new Movie[filme.size()];
   	filme.toArray(filmliste);
   	return filmliste;
   		   
	   
   }
}
 
die Methode MoviesDirectedBy wird aus dieser Klasse aufgerufen...

Java:
import java.util.ArrayList;

public class MovieLister {
	
private IMovieFinder movieFinder = new XMLMovieFinder();
public MovieLister(){}

	public Movie[] moviesDirectedBy(String director){		

   	ArrayList<Movie> allefilme = movieFinder.findall();
   	ArrayList<Movie> filme = new ArrayList<Movie>();
   
   	
	   	for(int j = 0; j < allefilme.size(); j++){
	   		if(allefilme.get(j).getDirector().equals(director)){
	   			filme.add(allefilme.get(j));
	   		}
	   	}
	Movie[] filmliste = new Movie[filme.size()];
   	filme.toArray(filmliste);
   	return filmliste;
   		   
	   
   }
}

gut ... ich sehe da aber nirgends ein "NULL" ... ergo kannst du im caller auch nicht auf "NULL" prüfen


btw : kann man überhaupt [c]Object[] == null[/c] schreiben ?
 
Wenn kein Wert gefunden wird, bekommst du nicht [c]null[/c], sondern ein Array der Länge 0 zurück. Der Test muss also [c]if(film.length > 0)[/c] lauten.
 
Also mal 2 kleine Brocken aus deinem ersten code:

Java:
MovieLister mlist = new MovieLister();
    
Movie[] film = mlist.moviesDirectedBy(regisseur);

wenn ich mich richtig zurückerinnere ist das hier schon irgendwie eine komische Sache. Du erstellst ein neues Objekt vom Typ MovieLister . Etwas später erstellst du ein Array vom Typ Movie und statt dieses Array zu instanziieren und mit dem Inhalt deiner Abfrage zu befüllen weist du der film-Variablen lediglich eine Referenz zu.

mlist.moviesDirectedBy(regisseur) gibt ja bereits ein Array zurück. Daher kannst du bereits dieses Array (also den Rückgabewert der Methode) nach seiner Grösse abfragen :

Java:
if (mlist.moviesDirectedBy(regisseur).length > 0)
{
 .....
}

Noch ne kleine Anmerkung : Zeile 20 -->[c] int i = 0;[/c] paar Zeilen weiter benutzt du das i und weist erneut 0 zu --> [c] for (i = 0 ;.... )[/c]. doppelt gemoppelt 😉 Besser und sicherer ist es wenn du i nur im Schleifenkopf deklarierst/definierst da die Variable dann auch nur da sichtbar ist und die Gefahr eines Überschreibens etc nicht besteht.
Und noch eine Anmerkung : Bei Stringvergleichen (equals) ist es besser (ausser es kommt wirklich 100% auf die Schreibweise als Ergebnis an) equalsIgnoreCase(...) zu benutzen, sonst kommt öfter mal ein false zurück weil die Schreibweise nicht exakt war mit dem verglichenem String.
 
Zuletzt bearbeitet:
SUPER!!! VIELEN DANK!! es hat mit if(film.length > null) funktioniert, aber der Ausdruck if(film != null) ist doch das Gleiche oder? Was ist hier der Unterschied?

ich habe den Code in der Zwischenzeit umgeschrieben...hier...aber hat auch nicht funktioniert, leider

Java:
for(i=0;i<film.length;i++){
        	if(film[i]!=null)
        		System.out.println("regisseur" + " >>> " +film[i].getTitle());
        	else
    			System.out.println("Der Film existiert nicht");
 
Mit der einen Abfrage prüfst du ob deine Referenz null ist, mit der anderen Abfrage prüfst du ob das referenzierte Array leer ist.
 
>, <, ==, >=, <=

links grösser rechts
links kleiner rechts
links gleich rechts
links groesser gleich rechts
links kleiner gleich rechts

Sind alles Vergleiche auf Gleichheit
Der ! Operator bedeutet NICHT. In Verbindung mit = (also !=) bedeutet es also NICHT-GLEICH oder Ungleich.

Also if(a != b) bedeutet WENN a NICHT b ist. Zu deinem Code if(film != null) bedeutet WENN film NICHT null ist) Null ist nicht 0 (also kein Zahlenwert) . Dein film != null funktioniert daher, da in film eine Referenz (Zeiger) auf ein Array gespeichert ist und somit ist film nicht null.

film.length > null wird als Ergebnis immer true haben, da auch ein unbefülltes Array eine Grösse besitzt, nämlich 0. Und 0 ist "grösser" als null (Nichts).
 
Zuletzt bearbeitet:
[c]if(film.length > null)[/c] das will ich sehen welcher compiler das schluckt ...

allerhöchstens [c]if(film.length > 0)[/c]

der unterschied ist : mit dem einen prüfst du auf "länge größer 0" ... und das andere ist ein referenz-vergleich


[ot]könnte mir trotzdem jemand meine frage beantworten : Object[]==null ? ist das überhaupt möglich ?[/ot]
 
Ein Array ist kein primitiver Datentyp, von daher ist der Wert der zugehörigen Variablen eines nur definierten Arrays (also nicht mit [c] Object[] bla = new Object[...];[/c] instanziiert) null.

Bei primitiven Datentypen wie int short byte etc. ist mit der Definition [c] int i; [/c] bereits ein default-Wert (in Abhängigkeit des primitiven Datentyps) vorhanden.
 
gut ... wenn Object[] == null geht ... dann natürlich auch <? extends Object>[] == null ...

was mich jetzt noch interessieren würde : <primitiver Datentyp>[] == null ?
das die einzelnen elemente einen default-wert bekommen ist mir klar ... aber die referenz des arrays selbst müsste mann doch null setzen können ... oder hab ich da jetzt wieder mal denkfehler was Arrays angeht ?
 
Java:
<primitiver Datentyp>[] == null
Soll das nen generic sein? Das geht dann schonmal gar nicht. Generics können nicht primitiv sein.

Wenn das nur nen Platzhalter sein soll, dann ja, das geht.
Java:
int[] arr = null;
Das kannst du problemlos deklarieren.
 

Zurück
Oben