// Übungen Informatik II Universität München Sommer 2004
// Ralph Matthes, 21.6.2004

import java.util.Comparator;

/**
 * eine generische Implementierung des Comparator-Interfaces:
 * Implementierungen von Comparable werden hier benutzt
 */
public class Vergleicher implements Comparator{

    /* 
     * throws VergleicherException würde nötig, wenn VergleicherException
     * direkt von Exception erbte. Dann aber würde compare NICHT das Interface
     * Comparator implementieren. RuntimeExceptions müssen dagegen nicht
     * deklariert werden.
     */
    public int compare(Object o1, Object o2) //throws VergleicherException
    {
	
	/* damit der Compiller zufrieden ist, könnte man bloß die nächste Zeile
	   angeben    */
	//return 0       // nicht null!!!
	
	
	if (!(o1 instanceof Comparable))
	    throw new VergleicherException("erstes Argument nicht Comparable");
	/* Man könnte auch einfach return 0 statt throw ...  schreiben.
	   Dann wird man nicht gewarnt, und das Programm läuft weiter. */

	// Muß vor try-Block deklariert werden
	int ergebnis;

	try{
	ergebnis = ((Comparable)o1).compareTo(o2);
	}
	catch (ClassCastException derFehler){
	    // komplette Fehlermeldung ausgeben
	    derFehler.printStackTrace();

	    // dennoch normal weiterfahren
	    return 0;
	}
	return ergebnis;
    }
}
