【问题标题】:Avoid NullPointerException from user input避免来自用户输入的 NullPointerException
【发布时间】:2019-01-19 19:45:31
【问题描述】:

我使用的是 JDK 1.7, 我正在检查所有输入条件的代码。 如果用户没有在字符串中输入任何值,那么它会抛出 NullPointerException。 即使用户没有输入任何值,有没有办法防止导致 NullPointerException?

我尝试了 try catch 块来捕捉异常

import java.util.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
class TestClass {
   public static void main(String args[]) throws Exception {

    Scanner s = new Scanner(System.in);    
    int i=s.nextInt();
    System.out.println(i);

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String str = br.readLine();
    try{
        int length=str.length();  //NullPointerException here

        if(length>=1 && length<=15)
        {
            System.out.println(str);
        }
    }
    catch(NullPointerException e)
    {
        System.out.println("Must enter a string");
    }
   }
}

样本输入- 5 空

预期输出- 5 (空字符串值->“”但没有异常抛出消息)

【问题讨论】:

  • NPE 是未经检查的异常,因此捕获它是不好的做法。相反,只需做一个简单的null 检查
  • 另外,为什么要同时读取ScannerBufferedReaderSystem.in 读取?为什么不删除BufferedReader 而只保留String str = s.nextLine()? (关于您未来可能提出的问题,请阅读this
  • 我认为这是一个环境问题。当我在 JDK 1.7 中编译和运行它时,我没有得到 NullPointerException。请确保您正在运行正确的课程。
  • 如果str为null,调用任何方法如.length()都会引发NullPointerException

标签: java


【解决方案1】:

Java 8

int length = Optional.ofNullable(str).orElse("").length();

Java 7

int length = str == null ? 0 : str.length();

Java 7 + Apache Commons

int length = StringUtils.length(str);

使用Scanner

使用Scanner 代替BufferedReaderscane.nextLine() 不返回 null 字符串。


public static void main(String... args) {
    try (Scanner s = new Scanner(System.in)) {
        System.out.println(s.nextInt());

        s.nextLine();

        String str = s.nextLine();

        if (str.length() >= 1 && str.length() <= 15)
            System.out.println(str);
    }
}

【讨论】:

    【解决方案2】:

    您可以在调用 str.length() 之前检查 str 是否不为空,而不是 try/catch

    Scanner s = new Scanner(System.in);
    String str = s.nextLine();
    if (str != null && str.length() <= 15) {
       System.out.println(str);
    } else {
       System.out.println("Must enter a string");
    }
    

    【讨论】:

      【解决方案3】:
      import java.util.*;
      import java.io.BufferedReader;
      import java.io.InputStreamReader;
      class TestClass {
         public static void main(String args[]) throws Exception {
      
          Scanner s = new Scanner(System.in);    
          int i=s.nextInt();
          System.out.println(i);
      
          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          String str = br.readLine();
              if(str!=null && str.length() >=1 && str.length()<=15)
              {
                  System.out.println(str);
              }
          }
         }
      }
      

      【讨论】:

        【解决方案4】:

        1) 阅读文档 - 请注意 BufferedReader.readline 在明确定义的情况下可以合法地返回 null。

        2) 编写可以处理可能的 null 返回的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-01
          相关资源
          最近更新 更多