не нужно ловить исключение в реализации System.out? - PullRequest
0 голосов
/ 29 января 2012

Я новичок в Java, и чтобы прояснить "System.out", я прочитал соответствующий исходный код Java, а затем нашел что-то, что я не могу понять.Сначала исходный код "System.out":

public final static PrintStream out = nullPrintStream(); 

, затем я перешел на nullPrintStream

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

Мой вопрос: программа может выдать NullPointerException вфункция nullPrintStream(), и нам не нужно перехватывать исключение в 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[]) {

    }
}

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

Ответы [ 3 ]

3 голосов
/ 29 января 2012

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

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

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

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

1 голос
/ 29 января 2012

если я придерживаюсь метода throw Exception () в закрытом static int 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);
  }
}
1 голос
/ 29 января 2012

NullPointerException - это RuntimeException - его не нужно явно перехватывать.

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

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