Как да покажа изключение?

Проверявам дали въведеният от потребителя номер е Zeckendorf и искам да покажа изключение, ако не е, как да направя това? Освен това как да конвертирам Zeckondorf в неговия десетичен еквивалент?

import java.util.Scanner;


public class IZeckendorfNumberConvertor {
static String number;
int zeckonderEquivalent;
static Scanner scanner = new Scanner(System.in);

public static void main(String[] args) {

    convertToZeckonderNumber();
    isTrueZeckonderNumber();
}

private static boolean isTrueZeckonderNumber() {
    System.out.println("Enter a Zeckonder Number:");
    number = scanner.nextLine();
    if (number.equals("10100")) 
    {
        return true; } 
    else if (number.equals("010011") || number.equals("010100")) 
    { 
        return false; }
    return false;
}

private static void convertToZeckonderNumber() {

}}

person Jim Tim    schedule 04.11.2013    source източник
comment
Сигурни ли сте, че искате изключение, а не просто съобщение за обратна връзка?   -  person Simon Verhoeven    schedule 04.11.2013
comment
Да, изключение, трябва да предизвика изключение   -  person Jim Tim    schedule 04.11.2013


Отговори (7)


Съветвам ви да не показвате изключение (т.е. проследяване и други подобни), тъй като е много неприятно за потребителя. Можете да използвате синтаксиса за хвърляне, за да хвърлите правилно изключение:

 throw new Exception("Given number is not a Zeckendorf number");

но не забравяйте да го хванете и да покажете хубаво и чисто съобщение:

try {
   // Your input code goes here
} catch (Exception e) {
    System.out.println(e.getMessage());
}

Друг по-лесен вариант ще бъде просто да проверите върнатата стойност на метода и съответно да отпечатате резултатите.

Ще препоръчам да използвате последното решение, тъй като изключения се използват, когато нещо лошо и неочаквано се случи във вашата програма и искате да се справите с него елегантно. Във вашия случай поведението е очаквано (т.е. потребителят дава грешен номер), така че проверката на върнатата стойност ще бъде много чиста и по-лесна.

person giorashc    schedule 04.11.2013
comment
+1 за последния параграф: използването на булева връщана стойност е много по-чисто в този случай. - person Joffrey; 04.11.2013

Използвайте блока try catch за улавяне на изключение

            try {

            } catch (Exception e) {

                e.printStackTrace();
            }

Използвайте също throw за хвърляне на ново изключение

въведете описание на изображението тук

person Community    schedule 04.11.2013

Ако приемем, че наистина искате да покажете изключението, а не по-удобно за потребителя съобщение, първата стъпка вероятно е да получите изключението като низ. След това можете да правите каквото искате с този низ (ехо към конзолата, поставяне в javax.swing.JTextArea, изпращане по имейл и т.н.).

Ако само искате съобщението от изключението, тогава getMessage() ще направи:

try { ... }
catch(FooException e) {
    String msg = e.getMessage();
}

Ако обаче искате цялото изключение, проследяване на стека и всичко останало, ще искате нещо подобно:

public static String stackTrace(Exception e) {
    StringWriter w = new StringWriter();
    e.printStackTrace(new PrintWriter(w));
    return w.toString();
}

// ...

try { ... }
catch(FooException e) {
    String st = stackTrace(e);
}

Ако просто искате да повторите пълното проследяване на стека към конзолата, има метода printStackTrace(), без аргумент:

try { ... }
catch(FooException e) {
    e.printStackTrace();
}

Ако искате да поемете повече контрол върху представянето на проследяването на стека, можете да получите подробностите с:

try { ... }
catch(FooException e) {
    StackTraceElement[] stes = e.getStackTrace();
    // Do something pretty with 'stes' here...
}     
person Paul    schedule 04.11.2013

Можете просто да отпечатате съобщение за грешка до потребителя, че въведеното е грешно, като използвате просто if.

if(yourCondition){
    // Happy scenario
    // Go shead
}else{
    // Error Scenario
    System.out.println("Error. Invalid Input.");
    // If you persist to throw an exception, then you can do something like this
    // throw new Exception("Exception Explanation"); // I've commented this, but you can uncomment it if needed
    // But the advice is to display an error message, than throw a exception.
}

И по отношение на преобразуването, можете да конвертирате двоичен в десетичен по този начин

int i = Integer.parseInt(binaryString, 2); // 2 indicates the radix here, since you want to convert from binary.
person RainMaker    schedule 04.11.2013

С този кодов фрагмент можете да конвертирате низа в цяло число:

int numberAsInt;
    try {
          numberAsInt = Integer.parseInt(number);
    } catch (NumberFormatException e) {
          //Will throw an Exception
    }

Ако искате да създадете свой собствен клас Exception, можете да го направите, както е показано тук или просто хвърлете RuntimeException с

throw new RuntimeException("Your Message");
person Akkusativobjekt    schedule 04.11.2013

Моето мнение, можете да опитате нещо като следното

 public static void main(String[] args) {    
  if(!isTrueZeckonderNumber()){
      // your message should goes here
       System.out.println("Your message");
    }
 }

Ако наистина искате да хвърлите изключение, направете следното

 private static boolean isTrueZeckonderNumber() throws Exception{
    System.out.println("Enter a Zeckonder Number:");
    number = scanner.nextLine();
    if (number.equals("10100")) {
        return true;
    } else{
        throw new Exception("your message");
    }        
}
person Ruchira Gayan Ranaweera    schedule 04.11.2013

Какво имаш предвид, че искаш да покажеш изключение? Вместо това бих предложил просто да дадете обратна връзка на потребителя, тъй като изключенията се използват по-често за ИЗКЛЮЧИТЕЛНИ действия, които не трябва да се случват.

Въпреки това, ако искате, можете да отпечатате съобщение, обясняващо какво се е случило.

try {

} catch (Exception e) {
    System.out.println(e.getMessage());
}
person Daniel Larsson    schedule 04.11.2013