2012-01-29 2 views
0

Я новичок в java, и чтобы очистить «System.out», я прочитал соответствующий исходный код java, а затем найду то, что я не могу понять. Первый исходный код «System.out»:не нужно улавливать исключение при реализации System.out?

public final static PrintStream out = nullPrintStream(); 

тогда я пошел в nullPrintStream

private static PrintStream nullPrintStream() throws NullPointerException { 
    if (currentTimeMillis() > 0) { 
     return null; 
    } 
    throw new NullPointerException(); 
    } 

Мой вопрос: программа может бросить в функции nullPrintStream()NullPointerException, и мы needn» t, чтобы поймать исключение в public final static PrintStream out = nullPrintStream();? Чтобы пояснить это, я написал несколько тестовых кодов в Eclipse, следующим образом:

package MainPackage; 

public class Src { 
    private static int throwException() throws Exception{ 
     int m = 1; 
     if(m == 0) { 
      throw new Exception(); 
     } 
     return 0; 
    } 
    public static final int aTestObject = throwException(); <==Here i got an error 
    public static void main(String args[]) { 

    } 
} 

Так же, как я думаю, я получил сообщение об ошибке Unhandled тип исключения Exception, но почему System.out нормально, не делая с NullPointerException?

ответ

3

Java имеет специальный класс исключений, называемых RuntimeExceptions. Все они расширяют объект RuntimeException, который, в свою очередь, расширяет объект Exception. Особая вещь о RuntimeException (в отличие от обычного исключения) заключается в том, что ее не нужно явно бросать. В эту категорию входят несколько различных исключений, таких как IllegalArgumentException, IllegalStateException и т. Д.

Преимущество использования RTE при кодировании заключается в том, что вам не нужно покрывать свой код множеством инструкций try/catch/throws , особенно если ожидается, что исключения будут крайне редкими и маловероятными. Кроме того, если у вас есть общий механизм для ловли RTE, это также поможет убедиться, что ваше приложение работает с условиями проверки чисто.

Это говорит о том, что с RTE может быть гораздо труднее справиться, поскольку из подписи не очевидно, что конкретный класс или метод будет генерировать этот тип исключения. Следовательно, они не всегда являются хорошей идеей для API, если они не хорошо документированы.

A NullPointerException - это исключение RuntimeException и, следовательно, не обязательно должно быть явно объявлено в сигнатуре метода.

1

NullPointerException - RuntimeException - его не нужно явно улавливать.

если вы сделаете ваш метод сделать это, он не будет бомбить на компиляции:

private static int throwException() throws Exception{ 
    int m = 1; 
    if(m == 0) { 
     throw new RuntimeException(); 
    } 
    return 0; 
} 
+0

Спасибо, я получил it.But я получил еще один вопрос: если я придерживаться бросить 'Exception()' в 'частного статического Int throwException()', как я должен изменить 'публичный статический окончательный ИНТ aTestObject = throwException(); '? – Searene

+0

См. Ответ Питера Лори. Если вам нужно проверенное исключение, используйте его статический инициализатор.Конечно, как вы справляетесь с этим, зависит от вас, он выбрал AssertionError, который является мудрым выбором - трудно восстановить из класса, который не инициализирован правильно! – corsiKa

1

Если я придерживаюсь throw Exception() в private static int throwException(), как мне изменить public static final int aTestObject = throwException();

Вам может понадобиться ввести значение в статическом блоке и получить там исключение.

public static final int aTestObject; 
static { 
    try { 
    aTestObject = throwException(); <==Here i got an error 
    } catch (Exception e) { 
    throw new AssertionError(e); 
    } 
} 
+0

Спасибо. Я многому научился у него. – Searene

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