【问题标题】:Why isn't my code working as intended? I think there is a problem with a null pointer exception. (Java) [duplicate]为什么我的代码没有按预期工作?我认为空指针异常存在问题。 (Java)[重复]
【发布时间】:2020-03-13 10:05:02
【问题描述】:

我的代码比较简单。我必须创建一个程序来输入字符串,并跟踪每个字符串的频率。以及用户应该能够输入一行,单击回车并能够输入下一行等,直到用户连续两次单击回车。到目前为止,这是我的代码:

package javaapplication8;

import java.util.Scanner;

public class JavaApplication8 {

static Scanner sc = new Scanner (System.in);

public static void main(String[] args) {
    System.out.print("Enter a sentence: ");
    String input = sc.nextLine() ;
    while (input!=null) {
        if (input.isEmpty()){
            System.out.println("Read Enter Key.");
            break;
        } else if (sc.hasNextLine()){
            input = sc.nextLine();
        } else {
            input = null;
        }
    }
    String sentence = input.replaceAll("\\W", "");
    sentence = sentence.toUpperCase();
    int [] frequencies = new int [26];
    int value = 65;
    double valuecount = 0;

    for (int i = 0; i < 26 ; i++) {
        for (int i2 = 0; i2 < sentence.length(); i2++){
            if (sentence.charAt(i2) == value){
                valuecount += 1 ;
            }
        }
        double percent = (valuecount / sentence.length() ) * 100;
        char val = (char) value;
        System.out.format (val + " occured %.2f percent of the time. \n", + percent);
        value += 1;
        valuecount =0 ;
    }
}
}

Netbeans 没有给我任何语法错误,这意味着没有任何异常堆栈跟踪。我猜问题出在我的 while 循环中的 replaceAll 行和 null 语句之间(这允许用户在程序运行之前单击两次 enter 键。

我是 Java 新手,对于任何“新手错误”,我深表歉意

谢谢!

编辑:抱歉,我认为异常堆栈跟踪是您在运行程序时出现语法错误(缺少分号等)时得到的红色文本

我的意思是我的程序运行了,但它给了我 NaN 而不是百分比量,但是当我删除整个 while 循环时,程序在没有下一行功能的情况下完美运行。

【问题讨论】:

  • “Netbeans 没有给我任何语法错误,这意味着没有任何异常堆栈跟踪”这是完全错误的。事实上,如果您确实有语法错误,就不可能获得异常堆栈跟踪,因为语法错误会阻止您启动程序,并且无法从从未开始运行的程序中抛出异常。
  • 您的while 循环试图实现什么?在它开始之前,您似乎已经掌握了这个句子。
  • String sentence = input.replaceAll("\\W", ""); 这可能会导致 NPE 问题
  • 是的,可以保证,因为我们只能在inputnull 时到达那条线。
  • 您的意思是改写while (input == null) 吗? (当然还要更改代码的其他部分...)看来您的目标是获得有效的输入,而您使用null 表示“无效”,因此无效意味着继续等待=> null意思是一直循环?

标签: java


【解决方案1】:

问题似乎是您读取输入的循环。在将字符串设置为 null 之前,您的 while 循环不会退出,这仅在将输入管道输入到 stdin 时发生。我相信如果你只想在字符串既不为空也不为空时继续,一个示例解决方案是:

while(true){
    if(input != null){
        if(!input.isEmpty()){
            break;
        }
    }
    input = sc.nextLine();
}

编辑: 道歉没有完全理解你想要达到的目标,而是假设。

将上面的 sn-p 替换为:

StringBuilder inputBuilder = new StringBuilder();
String nextInput = sc.nextLine();
while(true){
    if(nextInput != null){
        if(nextInput.isEmpty()){
            break;
        }
        inputBuilder.append(nextInput);
    }
    nextInput = sc.nextLine();
}
String input = inputBuilder.toString();

应该得到你所追求的行为

【讨论】:

  • 我尝试了你的代码行,它显示了百分比,但它并没有让我进入下一行。前任。我输入“Rocks are cool”我按一次回车键,光标转到下一行,我输入“Sand is not cool”并双击回车,然后程序告诉我每个字母出现的频率。
  • 如果下一个输入为空,则必须中断。这些代码都没有。
  • 绝对没有指定,但一个相当简单的修复
  • 不必指定。它是必需的,以避免在后续代码中出现 NPE。它实际上应该是while的控制条件:while ((nextInput = sc.nextLine()) != null)。没有什么是永远的。
  • 您可以通过持续循环直到它不为空来避免 NPE,因为他们将退出条件指定为在没有进入的情况下接收到新行。如果真的分裂头发,它应该在空值的情况下抛出异常,因为这是未定义的行为。
猜你喜欢
  • 2020-11-10
  • 2021-12-11
  • 2023-01-09
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
相关资源
最近更新 更多