java中的异常处理以下代码中出现错误

java中的异常处理以下代码中出现错误,java,exception-handling,Java,Exception Handling,我应该如何清除此错误?另外,请给我一些关于学习异常处理的链接。我对这个话题很困惑。给你 import java.io.*; public class Mainclassexec { public static void main(String[] args) { String input = null; try { String capitalized = capitalize(input)

我应该如何清除此错误?另外,请给我一些关于学习异常处理的链接。我对这个话题很困惑。

给你

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;
        }
}
一个建议是,NullPointerException是一个RuntimeException。你不必明确地抛出它。最好的做法是尽可能地处理空指针,而不是抛出空指针。它使代码变得糟糕,并且在编译时没有任何附加值


有关Java中异常处理的详细教程,请参考链接。

将IOException添加到大写方法引发的异常列表中

i、 e

通过这种方式,它告诉任何调用capiatlize方法的代码段,它必须能够处理这两种类型的异常。

异常教程


readLine是一个抛出IOException的方法,这意味着您的程序应该自行处理该错误。它是这样编写的,这样您就可以进行任何需要的测量,例如,向用户明确输入的字符串为null,这是java上的最佳实践,而不是试图使用s==null捕捉值。

将IOException添加到throws子句中。您还可以使用justexception。您还可以使用try-catch以不同的方式处理IOException—不推荐使用它或引发其他异常。
NullPointerException是未检查的,因此不需要添加到throws子句。

@Bragboy的回答足以修复编译错误并使程序正常工作。该方法修复的问题是BufferedReader.readLine方法可能引发IOException,这是一个已检查的异常。Java坚持认为,当在方法或该方法调用的其他方法中抛出选中的异常时,必须使用try/catch在该方法中捕获该异常,或者将其声明为由该方法抛出@Bragboy的答案在大写中执行后者,然后在main方法中捕获IOException

然而,还有其他重要问题

目前,capitalize并没有做方法名和签名明确暗示的事情。签名意味着该方法将其参数大写。事实上,它完全忽略其参数,而是从stand input读取字符串并将其大写

更好的设计是将输入字符串读入main方法中的input,并将其作为s参数传递。然后将大写更改为仅将参数字符串大写

风格的另外两点:

类名应为MainClassExec。。。不是Mainclassexec;有关Java命名约定的解释,请参阅Java样式指南

应用程序处理丢失输入的方式很糟糕。假设您已经按照我的建议固定了capitalize,那么main方法应该在调用capitalize之前测试输入变量是否为null

最后,在我看来,这样做几乎没有意义:

public static String capitalize(String s) throws NullPointerException, IOException
...
相反,您应该简单地执行以下操作:

if (x == null) {
    throw new NullPointerException(...);
}
x.something();
如果x为null,则会自动引发NullPointerException。此外,使用NullPointerException消息来包含用户错误消息是个坏主意。大多数NPE都是由于某个地方的编程错误造成的。如果您开始使用NPE来报告由于用户错误输入等原因而导致的错误,那么最终将陷入混乱

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