我有这行代码:
String name = Book.getName();
/*next lines of code*/
接下来,变量name
在没有任何检查的情况下处理其他代码。在某些情况下,可能出现name=null
和其他代码退出时出错的情况。
这很糟糕。
此外,我无法访问其他代码。
那么,你认为我的下一个实现是正确的:
try
{
String name = Book.getName();
if(null== name)
throw new NullPointerException("method 'getName' return null");
/*next lines of code*/
}
catch(NullPointerException e)
{
System.out.print("Hey! Where book name? I exit!");
System.exit();
}
在这种情况下,我还有其他选择吗
是否可以生成任何其他类型的Exception
或仅生成NullPointerException
?
谢谢。
编辑:
好的,
String name = Book.getName();
这是想象中的代码行。在实际情况下,我有更复杂的代码:
List<Book> bookList= new ArrayList<Book>();
String name = null;
Iterator i = BookShop.getBooks.iterator(); //BookShop it is input parameter!
while(i.hasNext())
{
Book book = (Book) i.next;
name = book.getName();
nameList.add(name);
}
这个例子更完整。
因此,在此代码中输入参数BookShop
对象。
这个对象有什么问题?
- BookShop可以是
NULL
- 方法CCD_ 7可以返回CCD_
此外,getName()
也可以返回NULL
。
所以,接下来的一般问题是:不能保证BookShop输入参数的正确性
我必须考虑所有可能的选项(3 NULL
)
对我来说,添加通用try-catch
块等等。
没有?
您可以通过扩展exception类来创建任何您喜欢的异常,例如NoNameProvidedException
。有很多例子,一个谷歌可以帮助你做到这一点。
我想在你的情况下,只要用if
检查name
是否是null
就足够了,因为你只想做System.exit()
。
您的代码有点不确定,但我认为您正在学习。您不需要显式抛出NullPointerException,您可以抛出任何您喜欢的Exception。但您可能并不真的需要在这里捕获异常,您只需检查null
,如果它是真的,则可以适当地处理这种情况。
此外,请避免Yoda conditions
。您的if
声明应为
if name is null
所以
if (name == null)
我可能会使用IllegalStateException
:
String name = Book.getName();
if (name == null) {
throw new IllegalStateException
("Method foo must not be called when the book has no name");
}
不过,这真的取决于这个州来自哪里——目前还不清楚这里出了什么问题。
我当然不会开始捕获NullPointerException
——这样的异常(以及非法状态)不应该被明确捕获。让它们冒泡起来,如果合适的话,有一些顶级处理程序。
正常控制流不应使用异常。只需使用if
块:
String name = Book.getName();
if (name == null) {
System.out.print("Hey! Where book name? I exit!");
System.exit();
}
/*next lines of code*/
在这种情况下不需要使用try-and-catch。你可以这样写:
if(Book.getName() != null)
String name = Book.getName();
else
//handle the situation with null
在这种情况下,您不需要抛出异常——只需处理null
值就可以了。
Java不使用异常,只检查返回值更友好
String name = Book.getName();
if (name == null)
System.out.print("Hey! Where book name? I exit!");
else {
/*next lines of code*/
}