2015-01-11 3 views
1

В настоящее время я изучаю, как правильно выполнять пользовательские исключения, и я наткнулся на проблему. Всякий раз, когда я пытаюсь использовать объект класса, который генерирует это настраиваемое исключение, мой отладчик IDE (я использую идею IntelliJ) говорит «Unhandled Exception: InsertExceptionName()». Этот код упрощенно выглядит примерно так. В этом случае он должен вернуть исключение, если случайно сгенерированное число равно < 0,5, и в противном случае вернуть число, но это не будет сделано. Что мне не хватает?Необработанное исключение в Java

public class main { 
    public static void main(String[] args) { 
     double x=Math.random(); 
     operation op=new operation(); 
     op.execute(x); 
    } 
} 

-

public class operation { 
    public operation() { 
    } 

    public double execute(double x) throws RandomWeirdException { 
     if(x<0.5) { 
      throw new RandomWeirdException("<0.5"); 
     } 
     return x; 
    } 
} 

-

public class RandomWeirdException extends Exception{ 
    public RandomWeirdException() { 
     super(); 
    } 
    public RandomWeirdException(String message) { 
     super(message); 
    } 
} 

ответ

1

Что вы имеете в виду "возвращение" исключение? Когда генерируется исключение, он пузырится на стек вызовов.

Вы не обрабатываете его в этом случае. Он достигает main, и поэтому у вас есть необработанное исключение.

Если вы хотите обработать исключение, вы должны использовать блок try-catch. Предпочтительно, окружающий main в этом случае.

try { 
    // Code that might throw 
    // an exception. 
} catch (Exception e) { 
    // Handle it. 
} 

Другим решением было бы указать, что main бросает «RandomWeirdException», а не catch его в первую очередь.

public static void main(String[] args) throws RandomWeirdException { ... } 

Это предпочтительнее просто Пусть функции throw, если вы не можете разумно обращаться с исключительным случаем. Если вы только catch ради ловли, не делая ничего значимого в исключительном случае, это эквивалент иногда скрыть ошибку.

+0

Большое спасибо! Кажется, я до сих пор не понимал цели блоков try-catch. – skulpt

0

Вы используете метод execute, не создавая блок try-catch для RandomWiredException, который он заявляет, что он метает. Java требовала, чтобы все проверенные исключения (которые расширяли Exception) надлежащим образом обрабатывались вызывающим абонентом - либо с помощью блока try-catch, либо путем добавления throws к вызывающему методу (в этом случае это main, хотя он не должен имеют пункт throws).

Таким образом, правильный способ сделать это, как:

public class Main { 
    public static void main(String[] args) { 
     double x=Math.random(); 
     operation op=new operation(); 
     try { 
      op.execute(x); 
     } catch (RandomWiredException e) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 
} 

Фактический код в пункте улова до требований вашего приложения, конечно.

Примечание: используйте начальную букву в верхнем регистре, когда вы называете классы. Это один из вариантов стилей Java, который улучшит читаемость кода.

Смежные вопросы