Нужно ли включать блоки catch в Java при вызове метода, который выдает исключения? - PullRequest
1 голос
/ 28 января 2012

я создаю приложение для Android. и набрал несколько кодов, например:

public void onCreate(Bundle savedInstanceState) {
...
XmlResourceParser xrp = getResources().getXml(R.xml.OneXml);   <==OneXml is a custom xml file in folder res/xml
...
try {
    ....
    xrp.next();
    .... 
} catch(IOException e) {
        e.printStackTrace();
} catch(XmlPullParserException e) {
        e.printStackTrace();
} 
...

Я обнаружил, что не могу ни удалить catch(IOException e), ни catch(XmlPullParserException e), когда я пытаюсь удалить один из них, Eclipse отмечает ошибку на xrp.next() и сообщает мне, что Необработанный тип исключения IOException или Необработанный тип исключения XmlPullParserException , поэтому я должен добавить два catch? почему Eclipse просит меня добавить два catch принудительно? Разве код не может быть успешно скомпилирован без двух catch?

Ответы [ 5 ]

2 голосов
/ 28 января 2012

Способы обработки исключений: Мы можем обработать «оператор проблемы» («оператор проблемы» - это любой оператор, который может вызвать исключение) двумя способами.

  • Заключить оператор в блок try-catch.
  • Добавитьthrows предложение в заголовке метода.

Обработка исключений в переопределенных методах: Если вы переопределяете метод в дочернем классе.Тогда вы не можете добавить пункт дополнительных бросков в свою подпись.В вашем случае onCreate - это метод в родительском классе, который переопределяется в дочернем классе, поэтому мы не можем добавить предложение throws в его заголовок.Таким образом, вы должны заключать любые «Заявления о проблемах» в методе onCreate в блоки try-catch.

Примеры: Заключите оператор в блок try-catch.

public void myMethod(){
        try{
            // Problem Statement
        }catch(IllegalAccessException e){
            e.printStackTrace();
        }catch(NullPointerException e){
            e.printStackTrace();
        }
    }

Добавьте предложение throws в заголовок метода.

public void myMethod()
        throws IllegalAccessException, NullPointerException{
            // Problem Statement
    }

Примеры Переопределенные методы: Допустимое предложение throws: Предложение throws в переопределенном методе действует, если оно также входит в метод parent.

public class Parent {
    public int method() 
        throws IllegalAccessException,NullPointerException, Exception {
        return 0;
    }
}
public class child extends Parent {
    // throws is part of method because parent method
    // have throws clause
    @Override
    public int method() 
        throws IllegalAccessException, NullPointerException,
            Exception {
            //Problem Statement
        return super.method();
    }
}

Недопустимое предложение throws: Предложение throws вПереопределенный метод недопустим, если он отсутствует в методе родителя.

public class Parent {
    public int method(){
        return 0;
    }
}

public class child extends Parent {
    //**Error:** We can not append throws clause in the method because
    // parent method do not have a throws clause
    @Override
    public int method() 
        throws IllegalAccessException, NullPointerException,
            Exception {
            //Problem Statement
        return super.method();
    }
}

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

public class child extends Parent {
    //**Error:** We can not append throws clause in the method because
    // parent method do not have a throws clause
    @Override
    public int method() {
        try{
            // Problem Statement
        }catch(IllegalAccessException e){
            e.printStackTrace();
        }catch(NullPointerException e){
            e.printStackTrace();
        }
    }
}
1 голос
/ 28 января 2012

В Java вам нужно либо перехватить исключения, либо объявить тот факт, что вызов метода может привести к исключению, например:

public void onSomethingOtherThanCreate(Bundle savedInstanceState) 
  throws IOException, XmlPullParserException
{
   // your code without any try/catch
} 

(Error и RuntimeException исключения, которые могут произойти в любойвремя не должно быть объявлено таким образом.)

0 голосов
/ 28 января 2012

Если вы жалуетесь на то, что вам нужно набрать два предложения catch, можно перехватить их все в одном предложении,

catch (Exception e) {
      // dostuff here
   }

Однако, если только вы не планируетеdo - это печать трассировки стека или запись исключения, эта практика неодобрительна.В долгосрочной перспективе это усложнит отладку и поддержку кода.

Java 7 позволяет перехватывать несколько исключений в одном предложении , но Android пока не поддерживает Java 7.

0 голосов
/ 28 января 2012

Это не Eclipse, это Java!

В методе код, который генерирует исключения, должен находиться внутри блока try-catch, если в самом объявлении метода не используется предложение throws для неупорядоченного исключения.

0 голосов
/ 28 января 2012

Вот что означают проверенные исключения: вы должны либо перехватить их, либо объявить их брошенными.

onCreate переопределяется и должен соответствовать объявлению исходного метода, поэтому либо перехватываете их, либо выполняете эту частьработы в другом методе, который их ловит, - ваш единственный вариант.

Подробнее см. JLS 11 , в частности JLS 11.2.3 Проверка исключений .

...