Обработка исключений в ошибке Java в следующем коде - PullRequest
0 голосов
/ 27 октября 2010
import java.io.*;
public class Mainclassexec
{

      public static void main(String[] args) 
      {
         String input = null;
         try 
         {
           String capitalized = capitalize(input);
           System.out.println(capitalized);
         } catch (NullPointerException e) 
           {
              System.out.println(e.toString());
           }
      }

      public static String capitalize(String s) throws NullPointerException
      {
            System.out.println("Enter a string");
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            s=br.readLine(); //--->error here IOException must be caught
            // or declared to be thrown
            if (s == null)
            {
               throw new NullPointerException("You have passed a null argument");
            }
            Character firstChar = s.charAt(0);
            String theRest = s.substring(1);
            return firstChar.toString().toUpperCase() + theRest;
        }
}

Как мне очистить эту ошибку? Также, пожалуйста, предложите мне несколько ссылок по обучению обработке исключений. Я очень запутался в этой теме.

Ответы [ 6 ]

0 голосов
/ 27 октября 2010

@ Ответа Bragboy достаточно, чтобы исправить ошибку компиляции и заставить программу работать. Проблема, которую это исправляет, заключается в том, что метод BufferedReader.readLine() может вызвать IOException, и это проверенное исключение. Java настаивает , что, когда в методе генерируется проверенное исключение (или какой-либо другой метод, вызываемый методом), оно ДОЛЖНО быть перехвачено в методе с использованием метода try / catch ИЛИ, объявленного как выброшенный методом. Ответ @ Bragboy делает последнее в capitalize, а затем перехватывает IOException в методе main.

Однако есть и другая важная проблема.

В настоящее время capitalize не выполняет то, что явно подразумевает название метода и подпись. Подпись подразумевает, что метод использует свой аргумент. Фактически, он полностью игнорирует свой аргумент и вместо этого читает (и использует заглавные буквы) строку из ввода триггера.

Лучше было бы прочитать входную строку в input в методе main и передать ее в качестве аргумента s. Затем измените capitalize на , просто используйте аргумент String.

Два других стиля:

  • Имя класса должно быть MainClassExec ... не Mainclassexec; обратитесь к Руководству по стилю Java для объяснения соглашений об именах Java.

  • То, как ваше приложение справляется с отсутствующим вводом, ужасно. Предполагая, что вы исправили capitalize, как я и предлагал, метод main должен проверить, что переменная input не равна null перед вызовом capitalize.

Наконец, на мой взгляд, редко бывает что-то подобное делать:

if (x == null) {
    throw new NullPointerException(...);
}
x.something();

Вместо этого вы должны просто сделать это:

x.something();

Это автоматически сгенерирует NullPointerException, если x равно null. Кроме того, не рекомендуется использовать сообщение NullPointerException для сообщения об ошибке пользователя. Большинство NPE происходят в результате ошибок программирования где-то. Если вы начнете использовать NPE для сообщения об ошибках, вызванных (например) неправильным вводом данных пользователем, вы получите беспорядок.

0 голосов
/ 27 октября 2010

Добавьте IOException к предложению throws.Вы также можете использовать только Exception.Вы также можете использовать try-catch для обработки IOException по-другому - потреблять его (не рекомендуется) или throw некоторые другие Exception.NullPointerException не отмечен, поэтому вам не нужно добавлять в предложение throws.

0 голосов
/ 27 октября 2010

BufferedReader.readLine () - это метод, который выдает IOException, то есть ваша программа должна сама обработать эту ошибку. Он написан таким образом, чтобы вы могли выполнять любые необходимые измерения (например, чтобы дать понять пользователю, что введенная строка является нулевой, что является наилучшей практикой в ​​Java, а не пытаться перехватить значение с помощью s==null) .

0 голосов
0 голосов
/ 27 октября 2010

Добавьте «IOException» в список исключений, которые выдает метод прописных букв

т.е.

public static String capitalize(String s) throws NullPointerException, IOException
...

Таким образом, любой фрагмент кода, вызывающий метод capiatlize, сообщает, что он должен обрабатывать оба типа исключений.

0 голосов
/ 27 октября 2010

Вот, пожалуйста,

public class Mainclassexec {

    public static void main(String[] args) {
        String input = null;
        try {
            String capitalized = capitalize(input);
            System.out.println(capitalized);
        } catch (IOException e) {
            System.out.println(e.toString());
        } 
    }

    public static String capitalize(String s) throws IOException {
        System.out.println("Enter a string");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        s = br.readLine(); 
        Character firstChar = s.charAt(0);
        String theRest = s.substring(1);
        return firstChar.toString().toUpperCase() + theRest;
    }
}

Один совет, NullPointerException - это RuntimeException.Вы не должны бросать это явно.Лучшая практика - обращаться с Nullpointers везде, где это возможно, вместо того, чтобы бросать его.Это делает код неприятным и не имеет никакой добавленной стоимости во время компиляции.

Вы можете сослаться на эту ссылку для подробного руководства по обработке исключений в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...