java程序无法读取字符串

java程序无法读取字符串,java,Java,请参阅上面的代码,它是无错误的,但在我输入双精度后,程序不会读取字符串,而是直接显示输出。但是当我注释int和double的扫描语句时,程序就会读取我的字符串。为什么会这样?更改此行 import java.util.*; class DataTypes { public static void main(String args[]) { int i = 4; double d= 4.0; String s = "Hackerrank"

请参阅上面的代码,它是无错误的,但在我输入双精度后,程序不会读取字符串,而是直接显示输出。但是当我注释int和double的扫描语句时,程序就会读取我的字符串。为什么会这样?

更改此行

import java.util.*;

class DataTypes {

    public static void main(String args[]) {
        int i = 4;
        double d= 4.0;
        String s = "Hackerrank";
        Scanner scan = new Scanner(System.in);
        int j = scan.nextInt();
        double d1 = scan.nextDouble();
        String s1 = new String();
        s1 = scan.nextLine();
        j = j+i;
        System.out.println(j);
        d1 = d1+d;
        System.out.println(d1);
        System.out.println(s+" "+s1);
        scan.close();
    }
}


您并没有按照您想要的方式读取字符串,只需使用下面的代码使其按您想要的方式工作即可

s1 = scan.next();
有关更多信息,请参阅此

编辑:
如果输入由带空格的字符串组成,则可以执行以下操作:

s1 = scan.next();
这是因为
nextDouble()
,此方法不会使用输入的最后一个换行符,因此在下次调用
nextLine()
时会使用该换行符。在读取字符串之前添加
newLine()
将消耗新行,您将能够输入字符串。

尝试以下操作:

scan.nextLine();
s1 = scan.nextLine();
换线

import java.util.*;
class Demo{
public static void main(String args[]){
  int i = 4;
  double d= 4.0;
  String s = "Hackerrank";
  Scanner scan = new Scanner(System.in);
  int j = scan.nextInt();
  double d1 = scan.nextDouble();
  String s1  = scan.next();
  j = j+i;
  System.out.println(j);
  d1 = d1+d;
  System.out.println(d1);
  System.out.println(s+" "+s1);
  scan.close();
 }
}
下线

 s1 = scan.nextLine();

将起作用。

这是因为您输入:,所以在获得新行之前,它不能转到下一行 因此,对于非字符串使用示例:

int j=scan.nextInt();scan.nextLine()

将此行替换为

import java.util.*;

class DataTypes {

    public static void main(String args[]) {

        int i = 4;
        double d = 4.0;
        String s = "Hackerrank";
        Scanner scan = new Scanner(System.in);

//      System.out.print("Enter j: ");
        int j = scan.nextInt();
        scan.nextLine();
//      System.out.print("Enter dl: ");
        double d1 = scan.nextDouble();
        scan.nextLine();

        String s1 = new String();
//      System.out.print("Enter s1: ");
        s1 = scan.nextLine();
        j = j + i;
        System.out.println(j);
        d1 = d1 + d;
        System.out.println(d1);
        System.out.println(s + " " + s1);
        scan.close();
    }
}

出现此问题是因为对
nextDouble
的调用只会消耗号码本身,而不仅仅是后面的换行

发生这种情况:

  • 您的程序要求扫描仪提供新的双精度扫描
  • 为控制台指定4个字符:
    0.1\n
  • 扫描仪从控制台读取,并获取
    0.1\n
  • 由于它现在可以计算两端的位置,它将
    \n
    推回其缓冲区
  • 您的程序要求扫描仪输入新的换行符
  • 扫描仪从其缓冲区读取:
    \n
  • 因为它找到了一个有效的行尾,所以返回它前面的字符串,而不带尾随的换行符
  • 有不同的解决方案:

    直接在输入中的数字后面加上字符串前缀:

    double d1 = Double.parseDouble(scan.nextLine());
    
    1 3.5I'm a short string
    
    手动使用代码中不需要的行字符:

    double d1 = Double.parseDouble(scan.nextLine());
    
    1 3.5I'm a short string
    
    呼叫下一步而不是下一行:

    double d1 = Double.parseDouble(scan.nextLine());
    
    1 3.5I'm a short string
    
    注意,这一次只消耗1个单词

            double d1 = scan.nextDouble();
            scan.nextLine();
            String s1 = scan.nextLine();
    
    通过调用nextline:

    double d1 = Double.parseDouble(scan.nextLine());
    
    1 3.5I'm a short string
    
    这将限制您的程序使用换行符分隔的数字,而不允许使用任何分隔符:

            double d1 = scan.nextDouble();
            String s1 = scan.next();
    

    如果已经设置了值,为什么要使用
    扫描仪
    ?@foxdie value已经设置为s而不是s1。我想通过从用户处读取s1来打印s和s1的连接字符串。他说的是“new string()”@Andy.inamdar扫描仪允许您输入值​​在控制台中…它用于验证结果是否正确或变量是否具有良好的值。这不是一个可以格式化的GUI。。。这更多的是一个信息。如果输入是“这是下一行”怎么办?是的。很明显。但是OP要求扫描新的“行”,而不是第一个单词。更好。另外,如果您解释为什么不应该使用“new String()”,您的答案将是完整的。请参阅问题中的“strings1=newstring();”一行。@LalitVerma非常感谢。它起作用了。但为什么它现在起作用了?为什么我们需要在s1=scan.nextLine()之前使用scan.nextLine()?我可以知道原因吗?这将对我有帮助。:)但是它不占用stringstry this
    double d1=double.parseDouble(scan.nextLine())中的空间请格式化您的代码,因为它几乎不可读。您还可以添加一些说明,而不是现成的解决方案