相关疑难解决方法(0)

避免!= null语句

我用object != null了很多东西来避免NullPointerException.

有没有一个很好的替代品呢?

例如:

if (someobject != null) {
    someobject.doCalc();
}
Run Code Online (Sandbox Code Playgroud)

NullPointerException当不知道对象是否存在时,这避免了a null.

请注意,接受的答案可能已过期,请参阅/sf/answers/167020941/以获取更新的方法.

java null object nullpointerexception

3904
推荐指数
42
解决办法
119万
查看次数

我应该使用哪个@NotNull Java注释?

我希望使我的代码更具可读性,并使用IDE代码检查和/或静态代码分析(FindBugs和Sonar)等工具来避免NullPointerExceptions.许多工具似乎与彼此的@NotNull/ @NonNull/ @Nonnull注释不兼容,并列出我的代码中的所有这些工具都很难阅读.有什么建议是"最好的"吗?这是我发现的等效注释列表:

  • javax.validation.constraints.NotNull
    创建用于运行时验证,而不是静态分析.
    文件

  • edu.umd.cs.findbugs.annotations.NonNull
    Findbugs静态分析使用,因此Sonar(现为Sonarqube)
    文档

  • javax.annotation.Nonnull
    这可能也适用于Findbugs,但JSR-305处于非活动状态.(另请参阅:JSR 305的状态是什么?) 来源

  • org.jetbrains.annotations.NotNull
    由IntelliJ IDEA IDE用于静态分析.
    文件

  • lombok.NonNull
    用于控制Project Lombok中的代码生成.
    占位符注释,因为没有标准.
    来源, 文档

  • android.support.annotation.NonNull
    Android中提供的标记注释,由support-annotations包
    文档提供

  • org.eclipse.jdt.annotation.NonNull
    Eclipse用于静态代码分析
    文档

java ide null annotations nullpointerexception

918
推荐指数
20
解决办法
27万
查看次数

检索方法是否应返回'null'或在无法生成返回值时抛出异常?

我有一个方法,如果找到它,它应该返回一个对象.

如果找不到,我应该:

  1. 返回null
  2. 抛出一个例外
  3. 其他

error-handling null exception

490
推荐指数
11
解决办法
14万
查看次数

如何在getter链中跟踪NullPointerException

如果我在这样的调用中得到NullPointerException:

someObject.getSomething().getSomethingElse().
    getAnotherThing().getYetAnotherObject().getValue();
Run Code Online (Sandbox Code Playgroud)

我得到一个相当无用的异常文本,如:

Exception in thread "main" java.lang.NullPointerException
at package.SomeClass.someMethod(SomeClass.java:12)
Run Code Online (Sandbox Code Playgroud)

我发现很难找到实际上调用returend null,经常发现自己将代码重构为这样的东西:

Foo ret1 = someObject.getSomething();
Bar ret2 = ret1.getSomethingElse();
Baz ret3 = ret2.getAnotherThing();
Bam ret4 = ret3.getYetAnotherOject();
int ret5 = ret4.getValue();
Run Code Online (Sandbox Code Playgroud)

然后等待更具描述性的NullPointerException,告诉我要查找哪一行.

你们中的一些人可能认为连接getter是一种糟糕的风格,无论如何都应该避免,但我的问题是:我可以在不更改代码的情况下找到错误吗?

提示:我正在使用eclipse,我知道调试器是什么,但我无法弄清楚如何将它应用于问题.

我对答案的结论是:
有些答案告诉我,我不应该一个接一个地连接吸气剂,一些答案显示我如何调试我的代码,如果我不赞成这个建议.

我已经接受了一个答案,这个答案让我知道什么时候连接吸气剂:

  • 如果他们不能返回null,只要你喜欢就链接它们.不需要检查!= null,无需担心NullPointerExceptions(请注意链接仍然是demeter的法则,但我可以忍受)
  • 如果它们可能返回null,则不要永远不会链接它们,并对每个可能返回null的值执行空值检查

这使得对实际调试的任何好建议毫无用处.

java debugging getter nullpointerexception

26
推荐指数
4
解决办法
7765
查看次数

如何管理无效检查的冲击?

通常,在编程中我们会遇到null检查显示特别大的情况.我说的是:

if (doc != null)
{
  if (doc.Element != null)
  {
    ... and so on
  }
  else
    throw new Exception("Element cannot be null");
} else {
  throw new Exception("document cannot be null");
}
Run Code Online (Sandbox Code Playgroud)

基本上,整个事情变成了一个难以理解的噩梦,所以我想知道:有没有更简单的方法来描述我上面要做的事情?(除了空检查,我string.IsNullOrEmpty不时会得到类似的东西.)

接受的答案:我接受了具有此链接的答案,因为所描述的方法具有创新性,正是我想要的.谢谢肖恩!

.net c#

22
推荐指数
4
解决办法
2408
查看次数

在Java应用程序中打开和返回数据库连接的最佳方法?

我提出了以下实用程序类:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MySqlConnection
{
    private static String dbUrl = "jdbc:mysql://localhost:3306/database";
    private static String dbUsername = "root";
    private static String dbPassword = "mysql";

    public static Connection getConnection()
    {
        Connection connection = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
        } catch (ClassNotFoundException e) {
            System.out.println("Could not load JDBC driver: " + e.getMessage());
        } catch (SQLException e) {
            System.out.println("Could not connect to DB: " + e.getMessage());
        }
        return connection;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是:我不想从我的方法返回null …

java database jdbc

12
推荐指数
1
解决办法
7489
查看次数

api文档和"价值限制":它们匹配吗?

您是否经常在API文档(例如"公共函数的javadoc"中)中看到"值限制"的描述以及经典文档?

注意:我不是在谈论代码中的注释

"价值限制",我的意思是:

  • 参数是否可以支持空值(或空字符串,或......)?
  • '返回值'可以为null或保证永远不为空(或者可以为"空",或者......)?

样品:

我经常看到的(无法访问源代码)是:

/**
 * Get all readers name for this current Report. <br />
 * <b>Warning</b>The Report must have been published first.
 * @param aReaderNameRegexp filter in order to return only reader matching the regexp
 * @return array of reader names
 */
 String[] getReaderNames(final String aReaderNameRegexp);
Run Code Online (Sandbox Code Playgroud)

希望看到的是:

/**
 * Get all readers name for this current Report. <br />
 * <b>Warning</b>The Report must have been published first.
 * @param aReaderNameRegexp filter …
Run Code Online (Sandbox Code Playgroud)

language-agnostic documentation comments design-by-contract

5
推荐指数
1
解决办法
1060
查看次数

Iterable:如果没有什么可迭代的,iterator() 是否可以返回 null?

实现接口的对象Iterable必须具有具有以下签名的方法:

Iterator<T> iterator()
Run Code Online (Sandbox Code Playgroud)

o 作为Iterable,此代码安全吗?

while(o.iterator().hasNext()) { ... }
Run Code Online (Sandbox Code Playgroud)

换句话说,iterator()如果没有什么可迭代的,可能会返回 null?

编辑:

1-正如你们中的一些人指出的,每次执行 o.iterator() 时返回的迭代器都是不同的。很公平!我必须承认,我在写问题时忘记了这一点。

假设这一行被重写:

Iterator<String> it = o.iterator();
....
....
while(it.hasNext() {...}
Run Code Online (Sandbox Code Playgroud)

2- 正如你们中的一些人所指出的,当 Iterable.iterator() 的文档说:“返回一组 T 类型元素上的迭代器”时,返回 null 是一种不好的编程习惯。

然而,我的问题是,Java API 文档中的某些“契约”是否直接或间接阻止返回 null。对我来说,“返回 T 类型元素集合上的迭代器”并不能阻止返回 null。我可能错了。

根据您的回答和其他研究得出的结论

总体而言:Java API 没有办法说明迭代器值是否可以为 null,除非在文档中明确说明。在本例中,没有说明任何内容,但明智的做法是认为 Java API 方法永远不会返回 null 迭代器值。这对于个人编写的 API 可能会有所不同。

  • 文档中没有任何内容阻止返回值为空(例如@NotNull)
  • 在 Javadoc 中,当 null 也是预期的时候,许多 @Return 都是明确的
  • 这个问题一般是关于空返回值的,很有趣。
  • 我发现了一种描述 API 的语言的尝试,尽管它是针对 .NET

java null iterator

2
推荐指数
1
解决办法
2万
查看次数