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

时间:2010-10-27 04:58:49

标签: java exception-handling

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 :(得分:0)

你走了,

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而不是扔掉它。它使代码变得讨厌,并且在编译期间没有附加值。

您可以参考this链接获取有关Java中异常处理的详细教程。

答案 1 :(得分:0)

将“IOException”添加到capitalize方法抛出的异常列表中

即。

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

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

答案 2 :(得分:0)

答案 3 :(得分:0)

BufferedReader.readLine()是一个抛出IOException的方法,这意味着您的程序应该自己处理该错误。它是这样写的,这样你就可以做任何你需要的措施(例如,向用户说明输入的字符串是null,这是java上的最佳实践,而不是试图使用{{1}来捕获值})。

答案 4 :(得分:0)

IOException添加到throws子句中。您也可以只使用Exception。您还可以使用try-catch以不同方式处理IOException - 使用它(不推荐)或throw其他ExceptionNullPointerException未经过检查,因此您无需添加throws子句。

答案 5 :(得分:0)

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

然而,还有其他重要问题。

目前capitalize没有执行方法名称和签名明确暗示的内容。签名意味着该方法将其参数大写。事实上,完全忽略了它的参数,而是从立场输入中读取(并大写)一个String。

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

另外两个风格点:

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

  • 您的应用程序处理缺少输入的方式很难看。假设您按照我的建议修复了capitalize,那么main方法应该在调用input之前测试null变量不是capitalize

最后,在我看来,很少有人这样做:

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

相反,你应该这样做:

x.something();

如果NullPointerExceptionx,则会自动抛出null。此外,使用NullPointerException的消息来包含用户错误消息是一个坏主意。大多数NPE发生在某处编程错误的结果。如果您开始使用NPE来报告(例如)来自用户的错误输入所导致的错误,那么您最终会陷入混乱。