検索

ホームページ  >  に質問  >  本文

Java 中, 是否有方法, 强制某 method 不接受 null 类型参数 ?

让某 method 明确声明: 我不接受 null 参数, 传了 null , 我马上崩溃 !

并且, 该抛错在编译阶段抛出, 不要跑到运行时去

天蓬老师天蓬老师2887日前471

全員に返信(2)返信します

  • PHPz

    PHPz2017-04-18 10:36:33

    Java の型システムはそれをサポートしておらず、プラグイン (Checker Framework) を通じてのみ実装できます。注釈を追加するには、コンパイル中にプラグインを指定します。

    上記はコンパイラによる null の検出を実装しています。null が渡された場合のクラッシュについては、プラグインを通じて null チェック コードを挿入することで実現できます。

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:36:33

    良い質問です。私は通常、関数の実装方法にのみ注目しますが、この質問のように、なぜ Java がこの方法で関数を実装しないのかについてはあまり考えていませんでした。 Java 構文がサポートされていれば、開発効率は少なくとも数倍向上するのではないかと、さまざまな想像が湧き起こりました。しかし、よく考えてみると、何かが間違っているように思えます。

    NullPointerException は、特定の理由による実行時例外です

    Java がそのような構文をサポートしていると仮定して、注釈 @NotNull を使用して、パラメーターが空ではないことを示します@NotNull标识参数不为空

    一个这样场景:用户登录成功后,更新用户的登录时间和ip。

    用户数据有:

    name password lasttime ip
    aaa 123456 2017-01-09 192.168.1.1
    bbb 123456 2017-01-08 192.168.1.1

    更新用户信息伪代码:

    public void updateAccount(@NotNull Account account) {
        // 因为肯定不为空,可以放心大胆的更新Account的最新登录时间、ip
    }

    @NotNull表示参数:account不能为空,这里没什么问题。

    获取用户信息验证登录伪代码:

    public Account login(String name) {
        // 1、连接数据库
        // 2、根据用户名获取Account
        // 3、验证用户信息
        // 4、验证成功返回Account信息,验证失败返回null
    }

    我们只是参数不能为空,并不让返回值不为空,这样也没什么问题。

    主逻辑判断伪代码:

    public static void main(String[] args) {
        AccountService service = new AccountService();
        // aaa登录
        Account account = service.login("aaa","123456");
        service.updateAccount(account);
        
        // bbb登录
        Account account = service.login("bbb","123456");
        service.updateAccount(account);
        
        // ccc登录
        Account account = service.login("ccc","123456");
        service.updateAccount(account);
    }

    那么问题来了,account参数到底能不能传入service.updateAccount()方法,编译能不能通过?从数据库中读取的Accoount对象本来就是个模凌两可对象,有可能代表某个人,也有可能是null

    次のようなシナリオ: ユーザーが正常にログインした後、ユーザーのログイン時間と IP を更新します。

    ユーザーデータには以下が含まれます:

    <テーブル> <頭> 名前 パスワード 前回 ip <本体> ああ 123456 2017-01-09 192.168.1.1 bbb 123456 2017-01-08 192.168.1.1 ユーザー情報を更新する疑似コード: リーリー

    @NotNull は、パラメータ account を空にすることはできないことを意味します。ここでは問題ありません。

    ログイン疑似コードを検証するためのユーザー情報を取得します:
      リーリー
    • パラメータが空であってはならず、戻り値が空であってほしくないことを確認するだけなので、問題はありません。

      メインロジック判定疑似コード:
    • リーリー
    • そこで問題は、account パラメータを service.updateAccount() メソッドに渡すことができ、コンパイルに成功できるかということです。データベースから読み取られた Account オブジェクトは本質的にあいまいなオブジェクトであり、特定の個人を表す場合もあれば、null である場合もあります。

      その後、戻り値をnull以外にしますか?
    はい、これは 🎜NullObject パターン 🎜 と呼ばれるパターンになります。これは、結果が空であることを表す専用の空のオブジェクトを作成することを意味します。 🎜 🎜詳細をご確認ください: 🎜 🎜 🎜🎜https://segmentfault.com/q/10...🎜🎜 🎜🎜http://www.cnblogs.com/haodaw...🎜🎜 🎜

    返事
    0
  • キャンセル返事