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;
}
}
我应该如何清除此错误?另外,请建议我学习异常处理的一些链接。我对这个话题非常困惑。
答案 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)
EXception tutorials
http://www.javabeginner.com/learn-java/understanding-java-exceptions
答案 3 :(得分:0)
BufferedReader.readLine()是一个抛出IOException的方法,这意味着您的程序应该自己处理该错误。它是这样写的,这样你就可以做任何你需要的措施(例如,向用户说明输入的字符串是null,这是java上的最佳实践,而不是试图使用{{1}来捕获值})。
答案 4 :(得分:0)
将IOException
添加到throws
子句中。您也可以只使用Exception
。您还可以使用try-catch
以不同方式处理IOException
- 使用它(不推荐)或throw
其他Exception
。
NullPointerException
未经过检查,因此您无需添加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();
如果NullPointerException
为x
,则会自动抛出null
。此外,使用NullPointerException
的消息来包含用户错误消息是一个坏主意。大多数NPE发生在某处编程错误的结果。如果您开始使用NPE来报告(例如)来自用户的错误输入所导致的错误,那么您最终会陷入混乱。