Как отобразить исключение?

Я проверяю, является ли номер, введенный пользователем, 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 для создания правильного исключения:

 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