NumberFormatException bei Kommandozeilen-Argumenten

kaffeetrinkerX14

Grünschnabel
Hallo! Bitte dringend um Hilfe!

Ich habe ein riesen großes Problem mit einem Rechner, zu dem man sowohl über Kommandozeilenargumenten als auch Konsoleneingabe Zugriff haben soll.

Aus irgendeinem Grund würgt der Rechner bei der NumberFormatException (Kommandozeilenargumente) jedoch ständig mein Programm ab, was nicht sein sollte....

Mir ist klar, das der Fehler in args[0] liegt, den ich als String deklariert habe aber bei keiner Eingabe natürlich keinen String finden kann. Aber wie kann man das Programm trotz dieses Fehlers weiterlaufen lassen, damit der in die Konsoleneingabe springt?

Eigentlich dürfte der diesen Fehler doch gar nicht ausgeben, weil das Array doch erst wenn die Bedingung if(args.length==0) nicht erfüllt wird, mit Daten gefüllt wird?

Hänge wirklich schon seit Wochen an diesem Problem, aber komme selbst nach dem Studieren von gefühlten 1000 Büchern, Skripten, Foreneinträgen etc. einfach nicht weiter:(

Hier ist mein Quellcode:

Code:
package rechnerc;


import java.text.DecimalFormat;
import java.util.InputMismatchException;
import java.util.Scanner;


public class RechnerC {

	/**
	 * @param args
	 */
	public static void main(String[] args){
		 Scanner scan = new Scanner (System.in);
		 
		 if(args.length==0){
			 try{
			 while(true){
					
					Scanner scan2 = new Scanner(System.in);
	                
			         System.out.println("Bitte geben Sie die erste Zahl ein: ");
						System.out.print("");
						double ab=scan2.nextDouble();
						System.out.println("Bitte geben Sie einen Operanden ein: ");
						System.out.print("");
			         String operatorb=scan2.next();
			         System.out.println("Bitte geben Sie die zweite Zahl ein: ");
						System.out.print("");
						double bb=scan2.nextDouble();
						double cb=0;
												
						DecimalFormat df2 = new DecimalFormat( "#" );
													
					    switch (operatorb) {
			             case "+":
			                 cb=ab+bb;
			                 System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			                 System.exit(0);
			                 break;
			             case "-":
			                 cb=ab-bb;
			                 System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			                 System.exit(0);
			                 break;
			             case "*":
			                 cb=ab*bb;
			                 System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			                 System.exit(0);
			                 break;
			             case "/":
			                 if(bb==0){
			                     { System.out.println("Division durch 0 nicht möglich!");
			                   
			                         }
			                     }
			                 
			                  else{	
			                                 
			                 cb=ab/bb;
			                 System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			                System.exit(0);
			                         }
			                 break;
			             case "pow":
			                 cb=Math.pow(ab, bb);
			           System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			           System.exit(0);
			                 break;
			             case "root":
			                 if(ab<0)
			                 {System.out.println("Wurzeln aus negativen Zahlen nicht möglich!");
			                 }
			                 
			                 else
			                 cb=Math.pow( ab, 1/bb);
			                 System.out.println("Das Ergebnis lautet: "+Math.round( cb * 10000. ) / 10000.);
			                 System.exit(0);
			                 break;
			             case "div":
			                 cb=Math.round(ab)/Math.round(bb);
			                 String d = df2.format( cb );
			                 System.out.println("Das Ergebnis lautet: "+d);
			                 System.exit(0);
			                 break;
			             case "mod":
			                 cb=Math.round(ab)%Math.round(bb);
			                 String s = df2.format( cb );
			                 System.out.println("Das Ergebnis lautet: "+s);
			                 System.exit(0);
			                 break;
			             default:
			                 
			                 System.out.println("Bitte nur gültige Rechenoperationen (+, -, *, /, pow, root, div, mod) eingeben!");
			                 
			                 break;
			         }	}}
			
		 	
			 catch(InputMismatchException e)
             {
            	 
             	 
                 System.err.println("Bitte für a und b nur Zahlen eingeben!");
                 scan.nextLine();
                 
             }
					


catch(ArrayIndexOutOfBoundsException e){
	
	scan.nextLine();
}

catch(NumberFormatException e)
{
	        	
	System.err.println("Bitte nur gültige Rechenoperatoren eingeben!");
	return;
	
	
}}
			
			
			 else{
				 try{
				String operator=args[1];
	    		double a=Double.parseDouble(args[2]);
		   		double b=Double.parseDouble(args[3]);
	    		double c=0;				
				DecimalFormat df2 = new DecimalFormat( "#" );
				switch (operator) {
				case "+":
					c=a+b;
					System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
					System.exit(0);
					break;
				case "-":
					c=a-b;
					System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
					System.exit(0);
					break;
				case "*":
					c=a*b;
					System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
					System.exit(0);
					break;
				case "/":
					if(b==0){
						{ System.out.println("Division durch 0 nicht möglich!");

						}}
					else{	
	 
						c=a/b;
						System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
						System.exit(0);
					}
					break;
				case "pow":
					c=Math.pow(a, b);
					System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
					System.exit(0);
					break;
				case "root":
					if(a<0)
					{System.out.println("Wurzeln aus negativen Zahlen nicht möglich!");
					}

					else
					c=Math.pow( a, 1/b);
					System.out.println("Das Ergebnis lautet: "+Math.round( c * 10000. ) / 10000.);
					System.exit(0);
					break;
				case "div":
					c=Math.round(a)/Math.round(b);
					String d = df2.format( c );
					System.out.println("Das Ergebnis lautet: "+d);
					System.exit(0);
					break;
				case "mod":
					c=Math.round(a)%Math.round(b);
					String s = df2.format( c );
					System.out.println("Das Ergebnis lautet: "+s);
					System.exit(0);
					break;
				default:

					System.out.println("Bitte nur gültige Rechenoperatoren (+, -, *, /, pow, root, div, mod) eingeben!");

					break;
					
				}	
				
				 
				 
				 
			 
				
				    
					}
		            
					
				
				
        
	
        
		 
		    	
                     catch(InputMismatchException e)
                     {
                    	 
                     	 
                         System.err.println("Bitte für a und b nur Zahlen eingeben!");
                         scan.nextLine();
                         
                     }
							
        
        
        catch(ArrayIndexOutOfBoundsException e){
        	
        	scan.nextLine();
        }
        
        catch(NumberFormatException e)
        {
        	        	
        	System.err.println("Bitte nur gültige Rechenoperatoren eingeben!");
        	return;
        	
        	
        	}
        
			}
		 
	}
}
 

sheel

I love Asm
Hi und Willkommen bei tutorials.de,

gibt es einen Grund, warum in deinem Code ziemlich alles redundant ist?
Ich räum ihn mal auf, vllt. wirds ja dadurch besser überschaubar...

PS: Weißt du, dass ein Arrayindex bei 0 beginnt?

edit:
Ca. so, ungetestet
Java:
import java.text.DecimalFormat;
import java.util.InputMismatchException;
import java.util.Scanner;

public class test {
	public static double calc(double v1, String op, double v2) throws Exception {
		switch (op) {
			case "+":
				return v1 + v2;
			case "-":
				return v1 - v2;
			case "*":
				return v1 * v2;
			case "/":
				if(v2 == 0.0)
					throw new Exception("Division durch Null!");
				return v1 / v2;
			case "pow":
				return Math.pow(v1, v2);
			case "root":
				if(v2 <= 0.0)
					throw new Exception("Exponent zu klein!");
				return Math.pow(v1, 1 / v2);
			case "div":
				if(Math.round(v2) == 0)
					throw new Exception("Division durch Null!");
				return (double)(Math.round(v1) / Math.round(v2));
			case "mod":
				if(Math.round(v2) == 0)
					throw new Exception("Division durch Null!");
				return (double)(Math.round(v1) % Math.round(v2));
			default:
				throw new Exception("Keine erlaubte Operation!");
		}
	}

	public static void main(String[] args) {
		double v1, v2;
		String op;

		try {
			if(args.length < 1) {
				Scanner scan;

				scan = new Scanner(System.in);
				System.out.println("Bitte geben Sie die erste Zahl ein:");
				v1 = scan.nextDouble();
				System.out.println("Bitte geben Sie einen Operanden ein:");
				op = scan.next();
				System.out.println("Bitte geben Sie die zweite Zahl ein:");
				v2 = scan.nextDouble();

				System.out.println("Ergebnis = " + calc(v1, op, v2));
			}
			else if(args.length == 3) {
				v1 = Double.parseDouble(args[0]);
				op = args[1];
				v2 = Double.parseDouble(args[2]);

				System.out.println("Ergebnis = " + calc(v1, op, v2));
			}
		} catch(Exception e) {
			System.out.println(e.toString());
		}
	}
}
 

kaffeetrinkerX14

Grünschnabel
Objekt orientiert... Natürlich, warum bin ich nicht darauf gekommen? Ja, die (sehr peinlichen) Fälle von Redundanz kamen von verzweifelten Versuchen, das ganze zu richten, weil immer wieder ein anderer Fehler aufgetreten ist.
Deine Version ist wirklich wesentlich überschaubarer....
Vielen vielen Dank, ich war wirklich schon am verzweifeln:)